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

Viewed 24741

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 in version 3.0 and below the buttons normally appear as OK / Cancel and in 4.0 and above it is Cancel / OK. I want to force my application to use Cancel / OK in the simplest way possible. I have a lot of AlertDialogs in the application.

8 Answers

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

}

Sometimes completely different perspectives are the solution to a problem, the HI-user culture.

  • In Win32 an OK and a Cancel button is absolutely necessary or the dialog will not work.
  • In Android the HI is quite different because of the existence of the OS "Back" button (onBackPressed() that could also be overridden, ESC on attached physical keyboards) in the operative system HI.

    • There is no need for a Negative/cancel button in most cases.
    • So most dialog are enough with the Positive button
    • Then there are no button order issue, the positive button is alone?
    • If you are in an edit field set it to edittext.setSingleLine(); and enter will move focus to the single positive button. Enter again and its positive button pressed.
    • If the user wants to push Cancel, he presses the OS "Back" button (As a developer we do not need to explain the core of the OS HI policy to the user, that is an issue of the OS issuer. We just leave the Android dialog without a Cancel button.)

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