How can I set the order of the positive and negative buttons in AlertDialog?

后端 未结 8 1727
挽巷
挽巷 2021-02-05 06:05

Why I want to do this is another discussion entirely, but I need to figure out the best way to make all my alert dialogs have the positive button on the right side. Note that i

相关标签:
8条回答
  • 2021-02-05 06:19

    There is absolutely no need to switch the order of any buttons!

    Apparently, it is not immediately obvious, but you can simply set the labels and the actions to ANY of the three handlers you have at your disposal, i.e. you are NOT required to have the OK button defined as a positiveButton.

    For example, you can attach your Cancel action to the setNeutralButton() button, and your "I feel lucky" action to the setNegativeButton().

    Android has no semantics attached to negative/positive/neutral so you might as well cancel your dialog in setPositiveButton() and confirm the dialog using setNegativeButton(). Just set the right labels and actions.

    Example:

    new AlertDialog.Builder(ctx)
            .setTitle("Switching buttons the easy way")
            .setPositiveButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            })
            .setNeutralButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(ctx, "I agree!", Toast.LENGTH_SHORT).show();
                }
            })
            .setNegativeButton("I feel lucky...", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(ctx, "Make a bet", Toast.LENGTH_SHORT).show();
                }
            })
            .create()
            .show();
    
    0 讨论(0)
  • 2021-02-05 06:21
    • In AlertDialog buttonPanel,the three buttons sort by [Neutral] [Negative] [Positive]
    • then you can set buttons like following codes

      builder.setNeutralButton("Negative",listener);

      builder.setNegativeButton("Neutral",listener);

      builder.setPositiveButton("Positive",listener);

    0 讨论(0)
  • 2021-02-05 06:32

    Unfortunately, I don't believe you can. However, to quote the documentation:

    Note: You can only add one of each button type to the AlertDialog. That is, you cannot have more than one "positive" button. This limits the number of possible buttons to three: positive, neutral, and negative. These names are technically irrelevant to the actual functionality of your buttons, but should help you keep track of which one does what.

    So you can turn the different buttons into whatever you want. What you're seeing here is the order having switched (ordering from this answer):

    • On devices prior to ICS, the button order (left to right) was POSITIVE - NEUTRAL - NEGATIVE.
    • On newer devices using ICS, the button order (left to right) is now NEGATIVE - NEUTRAL - POSITIVE.

    You might try checking the Build.VERSION and using that to decide which button is which at runtime.

    0 讨论(0)
  • 2021-02-05 06:35

    You can extend the AlertDialog.Builder to force the order:

    public class MyDialog extends AlertDialog.Builder {
    
        public MyDialog(Context arg0) {
            super(arg0);
        }
    
        @Override
        public Builder setPositiveButton(CharSequence text, OnClickListener listener) {
            if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
                return super.setNegativeButton(text, listener);
            } else {
                return super.setPositiveButton(text, listener);
            }
    
        }
    
        @Override
        public Builder setNegativeButton(CharSequence text, OnClickListener listener) {
            if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
                return super.setPositiveButton(text, listener);
            } else {
                return super.setNegativeButton(text, listener);
            }
        }
    
    }
    
    0 讨论(0)
  • 2021-02-05 06:40

    I've created a solution to force order of buttons for any Android version on any device.

    The idea is that we can get list of buttons of dialog in order they appear on screen and set text and actions in order we want. It guarantees that we would have same order on any device.

    Please check my GitHub repository

    Here is example of creating and showing dialog:

     new FixedOrderDialogFragment.Builder()
        .setLeftButtonText(R.string.left)
        .setCenterButtonText(R.string.center)
        .setRightButtonText(R.string.right)
        .setDefaultButton(FixedOrderDialogFragment.BUTTON_RIGHT)
        .setMessage(R.string.message)
        .setTitle(R.string.app_name)
        .create()
     .show(getSupportFragmentManager(), "DEMO");
    

    Please note that owner Activity should implement FixedOrderDialogFragment.FixedOrderDialogListener to be able restore dialog state on Activity re-creation.

    0 讨论(0)
  • 2021-02-05 06:42

    I figured I could just set the text for the positive button to Cancel and the negative to OK but it turns out they are in alphabetical order.

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