How to disable / enable dialog negative positive buttons?

前端 未结 7 1157
太阳男子
太阳男子 2020-11-28 23:30

Please look at the custom dialog below. I have an edittext field on the dialog and if the text field is empty I would like to disable the positiveButton. I can

相关标签:
7条回答
  • 2020-11-28 23:50

    You can write a listener to the edit text box, and try to enable or disable buttons. This is a sample code for 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 讨论(0)
  • 2020-11-28 23:53

    Edit for complete solution...

    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);
            }
    
        }
    });
    

    Below are edited history, which can be refer as some more details

    Here is a sample code, try this

    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);
    }
    

    For negative button

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

    For buttons id : Reference alert_dialog.xml

    Edited :

    And the setOnShowListener since level 8 API (FroYo), does the same,

    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();
    

    Edited

    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();
    

    0 讨论(0)
  • 2020-11-28 23:53
    if (editTextEmailAddress.getText().toString().length() == 0) {
        btnCancelCross.setEnabled(false);
    } else {
        btnCancelCross.setEnabled(true);
    }
    

    That might help you thanks.

    0 讨论(0)
  • 2020-11-28 23:56

    None of these answers really solve the problem.

    I accomplish this using a custom layout with an EditText in it and a TextWatcher on that view.

    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);
    
    0 讨论(0)
  • 2020-11-29 00:01

    This dialogFragment will do the job for you. Note that the dialog will remain open after screen rotation preserving any text that the user has already typed in. If you don't want that to happen you need to dismiss the fragment in your activity's onStop. The newInstance method signature can be changed to whatever you need.

    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);
        }
    }
    

    Add implements to your activity (any type of Activity is fine):

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

    Create the diaglogFragment in your activity like this:

    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);
    

    Handle the result in your activity like this:

    @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.
    }
    

    You need to create the resource identifier so add this resource under somewhere under res/values

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <item name="dialog_edit_text" type="id"/>
    </resources> 
    
    0 讨论(0)
  • 2020-11-29 00:07

    For delete record from database list view using view holder you used this code in your getview() method..

    viewHolder.btn.setOnClickListener(new OnClickListener() {

                    @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();
    
                    }
                });
    

    Read More

    0 讨论(0)
提交回复
热议问题