为什么我要这样做完全是另一个讨论,但我需要找出使所有警报对话框在右侧都有正面按钮的最佳方法。请注意,在3.0版及更低版本中,按钮通常显示为“确定/取消”,而在4.0及更高版本中则为“取消/确定”。我想强制我的应用程序以最简单的方式使用取消/确定。我在应用程序中有很多AlertDialog。
答案 0 :(得分:16)
不幸的是,我不相信你能。但是,引用documentation:
注意:您只能将每种按钮类型中的一种添加到AlertDialog中。也就是说,你不能有一个以上的“肯定”按钮。这将可能的按钮数量限制为三个:正面,中性和负面。这些名称在技术上与按钮的实际功能无关,但应该可以帮助您跟踪哪个名称的功能。
因此,您可以将不同的按钮转换为您想要的任何按钮。你在这里看到的是已切换的订单(从this回答排序):
您可以尝试检查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用户文化。
在Android中,HI由于操作中存在操作系统的“后退”按钮(onBackPressed()也可以被覆盖,在已连接的物理键盘上为ESC),因此HI有很大不同。系统HI。
答案 6 :(得分:0)
然后您可以设置类似以下代码的按钮
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();