关于android:在对话框中设置按钮背景?

Set a background to buttons in a dialog?

我有一个对话框,对我来说效果很好,但我想在此对话框中为两个按钮设置背景。 它的结构非常复杂,所以我不想将它重写为自定义对话框。 但在这种情况下,是否有可能设置背景(更具体地说,有没有办法将样式设置为正/负/中性按钮)?


从根本上说,你想要访问对话框按钮:这些(在标准的AlertDialog上)目前有ids android.R.id.button1为正,android.R.id.button2为负,android.R.id.button3为中性。

例如,要在中性按钮上设置背景图像,您可以执行以下操作:

1
2
3
4
5
Dialog d;
//
// create your dialog into the variable d
//
((Button)d.findViewById(android.R.id.button3)).setBackgroundResource(R.drawable.new_background);

编辑:如果您使用AlertDialog.Builder创建它。据我所知,这些按钮分配可能会在将来发生变化,因此请记住这一点。

编辑:下面的代码块应该生成看起来像你想要的东西。事实证明,你必须在更改背景之前调用show

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage("TEST MESSAGE)
        .setPositiveButton("
YES", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
            }
        })
        .setNegativeButton("
NO", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
            }
        });
        AlertDialog alert = builder.create();
        alert.show();
((Button)alert.findViewById(android.R.id.button1)).setBackgroundResource(R.drawable.button_border);


实际上,获得Dialog的按钮比使用@Femi发布的按钮更好更可靠。

您可以使用getButton方法:

1
Button positiveButton = yourDialog.getButton(DialogInterface.BUTTON_POSITIVE);

DialogInterface提供了所有需要的常量:

1
2
3
DialogInterface.BUTTON_POSITIVE
DialogInterface.BUTTON_NEUTRAL
DialogInterface.BUTTON_NEGATIVE


如果要保留标准文本按钮并更改按钮的背景和整个对话框,可以在styles.xml中定义自己的对话框主题,如下所示:

1
2
3
<style name="MyDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert">
        <item name="android:background">@color/colorBackground</item>
</style>

...然后当你构建对话框来设置它的背景时:

1
AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.MyDialogTheme);

1
2
3
4
5
6
AlertDialog alert = builder.create();
alert.show();
Button bn = alert.getButton(DialogInterface.BUTTON_NEGATIVE);
bn.setBackgroundColor(Color.RED);
Button bp = alert.getButton(DialogInterface.BUTTON_POSITIVE);
bp.setBackgroundColor(Color.YELLOW);

请注意,对于此类问题,覆盖show()方法是不好的做法。

为了将解决方案封装到对话框本身的创建中,最佳做法是在对话框构造函数中进行按钮自定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class CustomDialog extends AlertDialog
{
    public CustomDialog(final Context context)
    {
        super(context);

        setOnShowListener(new OnShowListener()
        {
            @Override
            public void onShow(DialogInterface dialog)
            {
                Button negativeButton = getButton(DialogInterface.BUTTON_NEGATIVE);  
                Button positiveButton = getButton(DialogInterface.BUTTON_POSITIVE);

                negativeButton.setBackgroundColor(Color.GREEN);
                positiveButton.setBackgroundColor(Color.RED);
            }
        }
    }
}