如何在AlertDialog中设置积极和消极按钮的顺序?

23

为什么我想这样做是另一个完全不同的讨论,但我需要找出最好的方法来使所有的警示对话框都在右侧有确定按钮。请注意,在3.0及以下版本中,按钮通常显示为“确定/取消”,而在4.0及以上版本中,它是“取消/确定”。我希望以最简单的方式强制我的应用程序使用“取消/确定”方式。我在应用程序中有很多AlertDialogs。


3
我建议你不要这样做。对于用户来说,他们的大部分应用程序都显示“确定/取消”,但在一个应用程序中却显示“取消/确定”可能会让用户感到困惑。在我看来,保持一致性更好。 - kabuko
6
请参见上文:“我为什么想这样做是另外一场完全不同的讨论”。 - Micah Hainline
8个回答

18
很遗憾,我认为你做不到。然而,引用 文档 的说法:

注意:对于AlertDialog,您只能添加每个按钮类型的一个副本。也就是说,您不能有多个“positive”按钮。这限制了可能的按钮数为三个:positive、neutral和negative。这些名称在实际按钮功能上无关紧要,但应帮助您跟踪哪个按钮执行什么操作。

所以你可以把不同的按钮变成你想要的任何东西。你所看到的是按钮顺序已经改变(参考这里的回答):
  • 在ICS之前的设备上,按钮顺序(从左到右)为POSITIVE - NEUTRAL - NEGATIVE。
  • 在使用ICS的较新设备上,按钮顺序(从左到右)现在为NEGATIVE - NEUTRAL - POSITIVE。
你可以尝试检查Build.VERSION并在运行时使用它来确定哪个按钮是哪个。

1
这很有帮助,但似乎许多版本为4.0及以上的手机仍然没有反转按钮顺序。我只能说如果构建版本> = 4.0,则按钮顺序可能是取消/确定。 - Micah Hainline
3
在4.0.3版本中,基于按钮文本,负/正变化的顺序会发生改变。 - max4ever
3
我在警报对话框和支持警报对话框中看到了从左到右的“中性”、“负面”、“积极”的顺序。它们改变了想法吗? - sakis kaliakoudas
我已经测试过了,我的测试结果是Android在API 11 Honeycomb中更改了按钮顺序。为什么与您的ICS(API14)不同?在Honeycomb之前的设备上,按钮顺序(从左到右)为POSITIVE-NEUTRAL-NEGATIVE。在使用Holo主题的新设备上,按钮顺序(从左到右)现在为NEGATIVE-NEUTRAL-POSITIVE。您可以参考以下链接:https://dev59.com/c2gu5IYBdhLWcg3wU1qN - Dylan
8
现在(6.0版本),顺序为中立 - - - 负面 正面 - Rawling

8
这是我的解决方案。它对我很有效。
    // Show alertDialog after building
    AlertDialog alertDialog = createAlertDialog(context);
    alertDialog.show();
    // and find positiveButton and negativeButton
    Button positiveButton = (Button) alertDialog.findViewById(android.R.id.button1);
    Button negativeButton = (Button) alertDialog.findViewById(android.R.id.button2);
    // then get their parent ViewGroup
    ViewGroup buttonPanelContainer = (ViewGroup) positiveButton.getParent();
    int positiveButtonIndex = buttonPanelContainer.indexOfChild(positiveButton);
    int negativeButtonIndex = buttonPanelContainer.indexOfChild(negativeButton);
    if (positiveButtonIndex < negativeButtonIndex) {
        // prepare exchange their index in ViewGroup
        buttonPanelContainer.removeView(positiveButton);
        buttonPanelContainer.removeView(negativeButton);
        buttonPanelContainer.addView(negativeButton, positiveButtonIndex);
        buttonPanelContainer.addView(positiveButton, negativeButtonIndex);
    }

是的,它可以在API8(2.2)版本的Android模拟器上运行。 - 林奕忠
它正在运作,我认为这应该是被接受的答案。谢谢! - jagmohan

4
您可以扩展AlertDialog.Builder以强制顺序:
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);
        }
    }

}

1
看起来很多4.0及以上版本的手机仍然没有反转按钮顺序。我只能告诉你如果构建版本> = 4.0,那么按钮顺序可能是取消/确定。 - Micah Hainline

1
我想我可以将正按钮的文本设置为“取消”,将负按钮的文本设置为“确定”,但事实证明它们是按字母顺序排列的。

1
我已经创建了一个解决方案,可以强制任何设备上的任何Android版本的按钮顺序。
思路是我们可以获得对话框中按钮的列表,并按照它们在屏幕上出现的顺序设置文本和操作,这保证了我们在任何设备上都能拥有相同的顺序。
请查看我的GitHub存储库
以下是创建和显示对话框的示例:
 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");

请注意,所有者Activity应该实现FixedOrderDialogFragment.FixedOrderDialogListener以便在Activity重新创建时能够恢复对话框状态。

0

有时候,完全不同的观点是解决问题的方法,HI用户文化。

  • 在Win32中,确定和取消按钮是绝对必要的,否则对话框将无法工作。
  • 在Android中,由于操作系统“返回”按钮的存在(onBackPressed()也可以被覆盖,在附加物理键盘上为ESC),HI有所不同。

    • 在大多数情况下,不需要负面/取消按钮。
    • 因此,大多数对话框都足够使用积极的按钮
    • 然后就没有按钮顺序问题了,积极的按钮是独立的吗?
    • 如果您在编辑字段中,请将其设置为edittext.setSingleLine(); 然后按Enter键将焦点移动到单个积极按钮。再次按Enter键,它的积极按钮被按下。
    • 如果用户想要按取消,他按操作系统“返回”按钮(作为开发人员,我们不需要向用户解释操作系统HI策略的核心,这是操作系统发布者的问题。我们只需将Android对话框留空,不需要取消按钮。)

0
在AlertDialog的buttonPanel中,三个按钮按[Neutral] [Negative] [Positive]排序。
然后你可以像下面的代码一样设置按钮:
builder.setNeutralButton("Negative",listener);
builder.setNegativeButton("Neutral",listener);
builder.setPositiveButton("Positive",listener);

0

绝对没有必要交换任何按钮的顺序

显然不是立即显而易见的,但您可以简单地将标签和操作设置为您可以使用的三个处理程序中的任何一个,即您不需要 OK 按钮定义为positiveButton。

例如,您可以将取消操作附加到setNeutralButton()按钮,将“我感觉很幸运”操作附加到setNegativeButton()按钮。

Android没有与negative/positive/neutral相关联的语义,因此您可以在setPositiveButton()中取消对话框,并使用setNegativeButton()确认对话框。只需设置正确的标签和操作。

示例:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接