如何在AlertDialog中设置正负按钮的顺序?

时间:2012-07-12 20:11:13

标签: android alertdialog android-alertdialog

为什么我要这样做完全是另一个讨论,但我需要找出使所有警报对话框在右侧都有正面按钮的最佳方法。请注意,在3.0版及更低版本中,按钮通常显示为“确定/取消”,而在4.0及更高版本中则为“取消/确定”。我想强制我的应用程序以最简单的方式使用取消/确定。我在应用程序中有很多AlertDialog。

8 个答案:

答案 0 :(得分:16)

不幸的是,我不相信你能。但是,引用documentation

  

注意:您只能将每种按钮类型中的一种添加到AlertDialog中。也就是说,你不能有一个以上的“肯定”按钮。这将可能的按钮数量限制为三个:正面,中性和负面。这些名称在技术上与按钮的实际功能无关,但应该可以帮助您跟踪哪个名称的功能。

因此,您可以将不同的按钮转换为您想要的任何按钮。你在这里看到的是已切换的订单(从this回答排序):

  • 在ICS之前的设备上,按钮顺序(从左到右)为POSITIVE - NEUTRAL - NEGATIVE。
  • 在使用ICS的较新设备上,按钮顺序(从左到右)现在为负 - 中性 - 正面。

您可以尝试检查Build.VERSION并使用它来确定哪个按钮在运行时。

答案 1 :(得分:7)

这是我的解决方案。这对我有用。

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

答案 2 :(得分: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);
        }
    }

}

答案 3 :(得分:1)

我已经创建了一个解决方案,可以在任何设备上强制任何Android版本的按钮顺序。

我们的想法是,我们可以获得对话框的按钮列表,以便它们出现在屏幕上,并按照我们想要的顺序设置文本和动作。它保证我们在任何设备上都有相同的订单。

请查看我的GitHub repository

以下是创建和显示对话框的示例:

 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,以便能够在活动重新创建时恢复对话框状态。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

  • 在Win32中,绝对需要“确定”和“取消”按钮,否则对话框将无法工作。
  • 在Android中,HI由于操作中存在操作系统的“后退”按钮(onBackPressed()也可以被覆盖,在已连接的物理键盘上为ESC),因此HI有很大不同。系统HI。

    • 在大多数情况下,无需使用负/取消按钮。
    • 因此,使用“肯定”按钮,大多数对话框就足够了
    • 然后没有按钮顺序问题,肯定按钮是单独的吗?
    • 如果您在编辑字段中,请将其设置为edittext.setSingleLine();。并输入将焦点移至单个肯定按钮。再次输入并按下其肯定按钮。
    • 如果用户要按“取消”,则按OS的“后退”按钮(作为开发人员,我们不需要向用户解释OS HI策略的核心。 OS发行者。我们只保留没有取消按钮的Android对话框。)

答案 6 :(得分:0)

  • 在AlertDialog buttonPanel中,三个按钮按[中性]排序[负面] [正面]
  • 然后您可以设置类似以下代码的按钮

    builder.setNeutralButton( “负”,听者);

    builder.setNegativeButton( “中性”,听者);

    builder.setPositiveButton( “正”,听者);

答案 7 :(得分:0)

完全没有必要切换任何按钮的顺序

显然,这不是立即可见的,但是您可以简单地将标签和操作设置为您拥有的三个处理程序中的 ANY ,即您 >必须将确定按钮定义为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();