Làm thế nào để tắt / bật các nút tích cực tiêu cực của hộp thoại?


111

Vui lòng xem hộp thoại tùy chỉnh bên dưới. Tôi có một trường văn bản chỉnh sửa trên hộp thoại và nếu trường văn bản trống, tôi muốn tắt positiveButton. Tôi có thể nhận được một charListener cho trường văn bản nhưng tôi không chắc làm cách nào để thiết lập positivebuttontắt hoặc bật từ trình nghe đó? Tham chiếu cho các nút tích cực và tiêu cực là gì?

 case DIALOG_TEXT_ENTRY:
    // This example shows how to add a custom layout to an AlertDialog
    LayoutInflater factory = LayoutInflater.from(this);
    final View textEntryView = factory.inflate(R.layout.alert_dialog_text_entry, null);
    return new AlertDialog.Builder(AlertDialogSamples.this)
        .setIconAttribute(android.R.attr.alertDialogIcon)
        .setTitle(R.string.alert_dialog_text_entry)
        .setView(textEntryView)
        .setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                /* User clicked OK so do some stuff */
            }
        })
        .setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                /* User clicked cancel so do some stuff */
            }
        })
        .create();
}

Tôi nghĩ câu trả lời này trả lời câu hỏi của bạn [ stackoverflow.com/questions/4291548/… [1]: stackoverflow.com/questions/4291548/…
Alexander Kulyakhtin

cảm ơn nhưng đây không phải là câu trả lời. nó có thể hữu ích mặc dù. bởi vì nó vô hiệu hóa nút sau khi nhấp vào chính nó. đó không phải là điều tôi muốn. Tôi muốn hiển thị nó bị vô hiệu hóa tùy thuộc vào trường văn bản.
akd

1
if (editTextEmailAddress.getText (). toString (). length () == 0)
SALMAN

Về cơ bản, bạn đang tạo một đối tượng với tham chiếu ẩn danh khi nó được tạo, bạn không thể tham chiếu lại nó. Cảm ơn.
SALMAN

Câu trả lời:


207

Chỉnh sửa để có giải pháp hoàn chỉnh ...

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(android.R.drawable.ic_dialog_info);
builder.setTitle("Alert dialog title");
builder.setMessage("This is the example code snippet to disable button if edittext attached to dialog is empty.");
builder.setPositiveButton("PositiveButton",
        new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface arg0, int arg1) {
                // DO TASK
            }
        });
builder.setNegativeButton("NegativeButton",
        new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface arg0, int arg1) {
                // DO TASK
            }
        });

// Set `EditText` to `dialog`. You can add `EditText` from `xml` too.
final EditText input = new EditText(MainActivity.this);

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.MATCH_PARENT,
        LinearLayout.LayoutParams.MATCH_PARENT
);
input.setLayoutParams(lp);


builder.setView(input);

final AlertDialog dialog = builder.create();
dialog.show();

// Initially disable the button
((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);

// OR you can use here setOnShowListener to disable button at first time.

// Now set the textchange listener for edittext
input.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence s, int start, int before,
            int count) {
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
    }

    @Override
    public void afterTextChanged(Editable s) {

        // Check if edittext is empty
        if (TextUtils.isEmpty(s)) {
            // Disable ok button
            ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);

        } else {
            // Something into edit text. Enable the button.
            ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true);
        }

    }
});

Dưới đây là lịch sử đã chỉnh sửa, có thể tham khảo thêm một số chi tiết

Đây là một mã mẫu, hãy thử cái này

AlertDialog.Builder builder = new AlertDialog.Builder(AddSchedule.this);
builder.setIcon(android.R.drawable.ic_dialog_info);
builder.setTitle("Alert dialog title");
builder.setMessage("Dialog message");
builder.setPositiveButton("Button1", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface arg0, int arg1) {
        //DO TASK
    }
});
builder.setNegativeButton("Button2", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface arg0, int arg1) {
        //DO TASK
    }
});

AlertDialog dialog = builder.create();
dialog.show();

// After calling show method, you need to check your condition and enable/disable the dialog buttons 
if (your_condition_true) {
    // BUTTON1 is the positive button
    dialog.getButton(AlertDialog.BUTTON1).setEnabled(false);
}

Đối với nút phủ định

dialog.getButton(AlertDialog.BUTTON2).setEnabled(false); //BUTTON2 is negative button

Đối với id nút : Tham chiếu alert_dialog.xml

Đã chỉnh sửa:

setOnShowListener kể từ API cấp 8 (FroYo), cũng làm như vậy,

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setPositiveButton(android.R.string.ok, null);

AlertDialog dialog = builder.create();
dialog.setOnShowListener(new OnShowListener() {

    @Override
    public void onShow(DialogInterface dialog) {
        if (condition) {
            ((AlertDialog)dialog).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
        }
    }
});

dialog.show();

Đã chỉnh sửa

new AlertDialog.Builder(this)
    .setMessage("This may take a while")
    .setPositiveButton("OK", new android.content.DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            ((AlertDialog)dialog).getButton(which).setVisibility(View.INVISIBLE);
            // the rest of your stuff
        }

    }).show();


sửa cho tôi nếu tôi sai nhưng khi bạn gọi lại AlertDialog thì nó có được gọi lại là đối tượng của nó không hay nó vẫn sử dụng cùng một đối tượng. Tôi không biết về phương pháp này. Bạn có nên giải thích ngắn gọn không? Cảm ơn :)
NovusMobile

Đối với người đọc lướt, tôi muốn thêm hộp thoại đó .getButton () chỉ hoạt động cho AlertDialogs, vì vậy bạn có thể phải truyền hộp thoại đến AlertDialog khi bạn thực hiện ở phần sâu hơn trong bài đăng.
Noumenon

không làm việc - tôi cũng đọc mã ít nhất 5x, và nó vẫn không có ý nghĩa tại sao nó nên làm việc :) Câu trả lời đúng là dưới đây từ Nick Palmer
qkx

@qkx Bạn có thể giải thích những gì bạn đang cố gắng làm. Bạn có thể hiển thị mã liên quan không? Và đừng mỉa mai và làm phản.
Pankaj Kumar

1
Tôi không muốn bị mỉa mai, thô lỗ. Ngoài ra, tôi đã cố gắng hủy bỏ phiếu giảm giá nhưng không được ... Tuy nhiên, một lần nữa vấn đề - bạn có trình nghe văn bản ở đâu trong mã của mình, bạn có thể cho tôi biết được không? Không quan trọng điều kiện là gì, nếu nó chỉ được gọi một lần. Nếu bạn không có người nghe văn bản như Nick dưới đây, thì giải pháp của bạn thật đơn giản là không thể hoạt động được ... Hoặc tôi đã bỏ lỡ một cái gì đó. Hoặc gửi cho tôi một số dự án android đơn giản để chứng minh điều đó đang làm việc;)
qkx

25

Không có câu trả lời nào trong số này thực sự giải quyết được vấn đề.

Tôi thực hiện điều này bằng cách sử dụng bố cục tùy chỉnh với EditText trong đó và TextWatcher trên dạng xem đó.

final LinearLayout layout = (LinearLayout) inflator.inflate(R.layout.text_dialog, null);
final EditText text = (EditText) layout.findViewById(R.id.text_edit);
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(layout);
// Now add the buttons...
builder.setPositiveButton(R.string.ok, new AlertDialog.OnClickListener() {
    // Left out for brevity...
}
builder.setNegativeButton(R.string.cancel, new AlertDialog.OnClickListener() {
    // Left out for brevity...
}

// Create the dialog
final AlertDialog d = builder.create();

// Now add a TextWatcher that will handle enable/disable of save button
text.addTextChangedListener(new TextWatcher() {
    private void handleText() {
        // Grab the button
        final Button okButton = d.getButton(AlertDialog.BUTTON_POSITIVE);
        if(text.getText().length() == 0) {
            okButton.setEnabled(false);
        } else {
            okButton.setEnabled(true);
        }
    }
    @Override
    public void afterTextChanged(Editable arg0) {
        handleText();
    }
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        // Nothing to do
    }
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
       // Nothing to do
    }
});

// show the dialog
d.show();
// and disable the button to start with
d.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);

Câu trả lời này là không đầy đủ, không có tuyên bốd
androidguy

Đã chỉnh sửa để thêm xây dựng của d.
Nick Palmer

4

Đây là mã hoàn chỉnh để bật và tắt nút tích cực của hộp thoại:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
LayoutInflater layoutInflater = MainActivity.this.getLayoutInflater();
View view = layoutInflater.inflate(R.layout.dialog,null);

builder.setView(view);
builder.setTitle("Test");
builder.setPositiveButton("ok", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        Toast.makeText(MainActivity.this, "Ok clicked", Toast.LENGTH_SHORT).show();
        dialog.dismiss();
    }
});
builder.setNegativeButton("cancel", null);

final AlertDialog alertDialog = builder.create();

alertDialog.show();

EditText editText = (EditText)view.findViewById(R.id.mobile_number);
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
editText.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {}

    @Override
    public void afterTextChanged(Editable s) {
        if (s.length() >= 1) {
            alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true);
        } else {
            alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);

        }
    }
});

1

Bạn có thể ghi một trình nghe vào hộp văn bản chỉnh sửa và cố gắng bật hoặc tắt các nút. Đây là mã mẫu cho xamarin.

var dialog = builder.Create();

dialog.Show();

var btnOk = dialog.GetButton((int)DialogButtonType.Positive).Enabled = false;

_enterTextDialogEditText.AfterTextChanged += (sender, e) => {
  if (!string.IsNullOrEmpty(_enterTextDialogEditText.Text)) {
    dialog.GetButton((int)DialogButtonType.Positive).Enabled = true;
  } else {
    dialog.GetButton((int)DialogButtonType.Positive).Enabled = false;
  }
};

0

Để xóa bản ghi khỏi chế độ xem danh sách cơ sở dữ liệu bằng trình giữ chế độ xem, bạn đã sử dụng mã này trong phương thức getview () của mình ..

viewHolder.btn.setOnClickListener (OnClickListener mới () {

                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    AlertDialog.Builder alertDialog2 = new AlertDialog.Builder(
                            Favorate.this.getParent());

                    // Setting Dialog Title
                    alertDialog2.setTitle("Confirm Delete...");

                    // Setting Dialog Message
                    alertDialog2
                            .setMessage("Are you sure you want delete ?");

                    // Setting Icon to Dialog
                    alertDialog2.setIcon(R.drawable.delete);

                    // Setting Positive "Yes" Btn
                    alertDialog2.setPositiveButton("YES",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                        int which) {
                                    // Write your code here to execute after
                                    // dialog

                                    int id = _items.get(position).id;
                                    db.deleterecord(id);

                                    db.close();
                                }
                            });
                    // Setting Negative "NO" Btn
                    alertDialog2.setNegativeButton("NO",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                        int which) {
                                    // Write your code here to execute after
                                    // dialog

                                    dialog.cancel();
                                }
                            });

                    // Showing Alert Dialog
                    alertDialog2.show();

                }
            });

Đọc thêm


0

Hộp thoại này sẽ thực hiện công việc cho bạn. Lưu ý rằng hộp thoại sẽ vẫn mở sau khi xoay màn hình, giữ nguyên bất kỳ văn bản nào mà người dùng đã nhập. Nếu không muốn điều đó xảy ra, bạn cần loại bỏ phân đoạn trong OnStop của hoạt động của mình. Chữ ký của phương thức newInstance có thể được thay đổi thành bất kỳ thứ gì bạn cần.

import android.app.Activity;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AlertDialog;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;

public class TextViewDialogFragment extends DialogFragment implements DialogInterface.OnClickListener, DialogInterface.OnShowListener, TextWatcher
{
    final static private String TITLE = "title", MESSAGE = "message", IDENTIFIER = "identifier", INPUT_TYPE = "inputType", POSITIVE_TEXT = "pText", NEGATIVE_TEXT = "nText", CANCELABLE = "cancelable";

    public TextViewDialogFragment()
    {
        super();
    }

    static public TextViewDialogFragment newInstance(int title, @Nullable String message, int identifier, int inputType, int positiveText, int negativeText, boolean cancelable)
    {
        TextViewDialogFragment fragement = new TextViewDialogFragment();
        Bundle args = new Bundle();
        args.putInt(TITLE, title);
        args.putString(MESSAGE, message);
        args.putInt(IDENTIFIER, identifier);
        args.putInt(INPUT_TYPE, inputType);
        args.putInt(POSITIVE_TEXT, positiveText);
        args.putInt(NEGATIVE_TEXT, negativeText);
        args.putBoolean(CANCELABLE, cancelable);
        fragement.setArguments(args);
        return fragement;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        Activity activity =  getActivity();
        Bundle args = getArguments();
        EditText input = new EditText(activity);
        input.setInputType(args.getInt(INPUT_TYPE));
        input.setId(R.id.dialog_edit_text);
        input.addTextChangedListener(this);
        AlertDialog.Builder alert = new AlertDialog.Builder(activity);
        alert.setCancelable(args.getBoolean(CANCELABLE)).setTitle(args.getInt(TITLE)).setMessage(args.getString(MESSAGE)).setView(input).setPositiveButton(args.getInt(POSITIVE_TEXT), this);
        int negativeText = args.getInt(NEGATIVE_TEXT);
        if (negativeText != 0)
        {
            alert.setNegativeButton(negativeText, this);
        }
        AlertDialog dialog = alert.create();
        dialog.setOnShowListener(this);
        return dialog;
    }

    @Override
    public void onShow(DialogInterface dialog)
    {
        // After device rotation there may be some text present.
        if (((EditText)((AlertDialog) dialog).findViewById(R.id.dialog_edit_text)).length() == 0)
        {
            ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
        }
    }

    @Override
    public void onClick(DialogInterface dialog, int which)
    {
        String text = ((EditText)((AlertDialog) dialog).findViewById(R.id.dialog_edit_text)).getText().toString();
        ((Callbacks) getActivity()).onTextViewDialogResult(which, getArguments().getInt(IDENTIFIER), text);
    }

    @Override
    public void onCancel(DialogInterface dialog)
    {
        ((Callbacks) getActivity()).onTextViewDialogActivityCancelled(getArguments().getInt(IDENTIFIER));
        super.onCancel(dialog);
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after)
    {
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count)
    {
    }

    @Override
    public void afterTextChanged(Editable s)
    {
        ((AlertDialog) getDialog()).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(s.length() > 0);
    }

    void setMessage(String message)
    {
        Bundle args = getArguments();
        args.putString(MESSAGE, message);
        setArguments(args);
    }

    interface Callbacks
    {
        void onTextViewDialogResult(int which, int identity, String text);
        void onTextViewDialogActivityCancelled(int identity);
    }
}

Thêm dụng cụ vào hoạt động của bạn (bất kỳ loại Hoạt động nào cũng được):

public class Myctivity extends AppCompatActivity implements TextViewDialogFragment.Callbacks
{
...
}

Tạo DiaglogFragment trong hoạt động của bạn như sau:

final static int SOMETHING = 1;
myDF = TextViewDialogFragment.newInstance(R.string.my_title, "my message", SOMETHING, InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, /* Whatever is best for your user. */    R.string.yay, android.R.string.cancel, true);

Xử lý kết quả trong hoạt động của bạn như sau:

@Override
public void onTextViewDialogResult(int which, int identity, String text)
{
    if (which == AlertDialog.BUTTON_NEGATIVE)
    {
        // User did not want to do anything.
        return;
    }
    // text now holds the users answer.
    // Identity can be used if you use the same fragment for more than one type of question.
}
@Override
public void onTextViewDialogActivityCancelled(int identity)
{
    // This is invoked if you set cancelable to true and the user pressed the back button.
}

Bạn cần tạo mã định danh tài nguyên vì vậy hãy thêm tài nguyên này vào một nơi nào đó dưới res / giá trị

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="dialog_edit_text" type="id"/>
</resources> 

-1
if(editTextEmailAddress.getText().toString().length()==0)
 {
 btnCancelCross.setEnabled(false);
}
else
{
 btnCancelCross.setEnabled(true);

}

Điều đó có thể giúp bạn cảm ơn.


cảm ơn nhưng đây không phải là những gì tôi đang tìm kiếm. Tôi có thể thực hiện nó bằng cách sử dụng hộp thoại tùy chỉnh và tạo bố cục bằng nút và bật chúng. Điều tôi đang tìm là có cách nào để tắt hoặc bật các nút tích cực và tiêu cực trong hộp thoại không? Nếu bạn nhìn vào đoạn mã tôi đã chia sẻ, bạn sẽ thấy những gì tôi đang tìm kiếm. Nhưng cảm ơn một lần nữa cho mã.
akd

2
Vui lòng đăng một câu trả lời toàn diện về chủ đề (chỉ chỉnh sửa câu trả lời hiện có của bạn, không tiếp tục đăng câu trả lời bổ sung).
Tim Post
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.