如何在Android 5中更改默认对话框按钮的文本颜色


160

我的应用程序中有很多警报对话框。这是默认布局,但我要在对话框中添加肯定和否定按钮。因此,按钮将获得默认的Android 5文本颜色(绿色)。我试图更改它,但没有成功。知道如何更改文字颜色吗?

我的自定义对话框:

public class MyCustomDialog extends AlertDialog.Builder {

    public MyCustomDialog(Context context,String title,String message) {
        super(context);

        LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
        View viewDialog = inflater.inflate(R.layout.dialog_simple, null, false);

        TextView titleTextView = (TextView)viewDialog.findViewById(R.id.title);
        titleTextView.setText(title);
        TextView messageTextView = (TextView)viewDialog.findViewById(R.id.message);
        messageTextView.setText(message);

        this.setCancelable(false);

        this.setView(viewDialog);

    } }

创建对话框:

MyCustomDialog builder = new MyCustomDialog(getActivity(), "Try Again", errorMessage);
builder.setNegativeButton("OK", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            ...
                        }
}).show();

negativeButton是默认对话框按钮,采用Android 5 Lollipop中的默认绿色。

非常感谢

带绿色按钮的自定义对话框


这些天,我觉得几乎重复的问题/答案stackoverflow.com/a/29810469/2291更适用。
乔恩·亚当斯

Answers:


191

您可以尝试先创建AlertDialog对象,然后使用它进行设置以更改按钮的颜色,然后显示它。(请注意,在builder对象上而不是调用show()我们进行调用create()以获取AlertDialog对象:

//1. create a dialog object 'dialog'
MyCustomDialog builder = new MyCustomDialog(getActivity(), "Try Again", errorMessage); 
AlertDialog dialog = builder.setNegativeButton("OK", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    ...
                }

            }).create();

//2. now setup to change color of the button
dialog.setOnShowListener( new OnShowListener() {
    @Override
    public void onShow(DialogInterface arg0) {
        dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(COLOR_I_WANT);
    }
});

dialog.show()

onShow()创建对话框之后,您必须继续操作并且不能仅获得该按钮的原因是该按钮尚未创建。

我更改AlertDialog.BUTTON_POSITIVEAlertDialog.BUTTON_NEGATIVE反映您的问题的更改。尽管“确定”按钮为否定按钮很奇怪。通常是肯定按钮。


感谢您的回答,但我在AlertDialog中没有该方法。看到我更新的帖子。
FOMDeveloper 2015年

5
该方法在AlertDialog类中,而不在Builder类中。因此,可以调用Builder.create()而不是调用Builder.show()来返回AlertDialog类。然后,您设置侦听器,然后在AlertDialog对象上调用show()
trungdinhtrong 2015年

3
但是必须有另一种方式来做到这一点。好像是主题的颜色,我们可以通过主题/样式来更改它吗?
milosmns

太棒了。刚刚在Xamarin.Android中尝试过,它的功能完美。非常感谢你。
perozzo

280

这是使用样式的自然方法:

如果您AppTheme的继承自Theme.MaterialComponents,则:

<style name="AlertDialogTheme" parent="ThemeOverlay.MaterialComponents.Dialog.Alert">
    <item name="buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
    <item name="buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
</style>

<style name="NegativeButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
    <item name="android:textColor">#f00</item>
</style>

<style name="PositiveButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
    <item name="android:textColor">#00f</item>
</style>

如果您AppTheme的继承自Theme.AppCompat

<style name="AlertDialogTheme" parent="ThemeOverlay.AppCompat.Dialog.Alert">
    <item name="buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
    <item name="buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
</style>

<style name="NegativeButtonStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
    <item name="android:textColor">#f00</item>
</style>

<style name="PositiveButtonStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
    <item name="android:textColor">#00f</item>
</style>

用你AlertDialogThemeAppTheme

<item name="alertDialogTheme">@style/AlertDialogTheme</item>

或在构造函数中

androidx.appcompat.app.AlertDialog.Builder(context, R.style.AlertDialogTheme)

34
我不得不将buttonBarNegativeButtonStyle更改为android:buttonBarNegativeButtonStyle,将buttonBarPositiveButtonStyle更改为android:buttonBarPositiveButtonStyle。然后它起作用了(API 21+)。
弗拉德

23
请记住使用android.support.v7.app.AlertDialog而不是android.app.AlertDialog。胡说八道的错误让我花了2个小时
thanhbinh84 '18

2
我必须将AlertDialogTheme的父级更改为“ Base.Theme.AppCompat.Light.Dialog.Alert”。并删除buttonBarNegativeButtonStyle和buttonBarPositiveButtonStyle。还要在AlertDialogTheme中添加<item name =“ colorAccent”> @ color / dashboard_red_color </ item>。nd工作完美。
zephyr

3
使用新的材料库时此方法不起作用,com.google.android.material:material:1.0.0-beta01而我正在使用Theme.MaterialComponents.Light.Dialog.Alert
Sanjeev

2
@LX更新了答案,以包含材料组件主题
Alexander Perfilyev,

120

按钮和其他文本的颜色也可以通过主题进行更改:

值21 / styles.xml

<style name="AppTheme" parent="...">
  ...
  <item name="android:timePickerDialogTheme">@style/AlertDialogCustom</item>
  <item name="android:datePickerDialogTheme">@style/AlertDialogCustom</item>
  <item name="android:alertDialogTheme">@style/AlertDialogCustom</item>
</style>

<style name="AlertDialogCustom" parent="android:Theme.Material.Light.Dialog.Alert">
  <item name="android:colorPrimary">#00397F</item>
  <item name="android:colorAccent">#0AAEEF</item>
</style>

结果:

对话 日期选择器


1
目前,我不知道仅更改复选框颜色或按钮颜色的方法。强调色会同时改变它们。
pepseps

4
我喜欢这种方法,但是我觉得在stackoverflow.com/a/29810469/2291上找到的答案是一种稍微干净的方法。
乔恩·亚当斯

12
为了使它在我的项目中起作用,我必须android:android:alertDialogTheme和中删除该部分android:colorAccent
ban-geoengineering

2
在值上使用android:前缀取决于您将styles.xml放在值中或在值-vXX中的位置
peceps

1
要使它与AppCompat和一个简单的values文件夹一起使用,只需遵循@ ban-geoengineering建议的更改
Felix,

94

最简单的解决方案是:

dialog.show(); //Only after .show() was called
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(neededColor);
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(neededColor);

4
这些字段不应该从非静态变量引用时,应AlertDialog.BUTTON_NEGATIVE
乔马赫

这是最好的和最简单的方法。请注意,我没有使用“创建”,而是在show()之后获取了对话框。像AlertDialog对话框= builder.show();
斯蒂芬·麦考密克,

2
尽管此解决方案可能有效,但从逻辑上讲它还是有缺陷的。这里发生的事情是您首先显示对话框,然后更改其外观。取决于底层的实现(可以随时间改变)和设备的性能,理论上您可以看到“闪烁”,即用户看到一个对话框,然后迅速更改其外观。
trungdinhtrong

31

有两种方法可以更改对话框按钮的颜色。

基本方式

如果您只想更改活动,请在下面写两行 alertDialog.show();

alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(getResources().getColor(R.color.colorPrimary));
alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(getResources().getColor(R.color.colorPrimaryDark));

推荐的

我建议在中添加一个主题AlertDialogstyles.xml这样您就不必在每次活动/对话调用中一次又一次地编写相同的代码。您可以只创建一种样式,然后将该主题应用于对话框。因此,无论何时要更改AlertDialog框的颜色,只需在styles.xml中更改颜色,所有对话框都将在整个应用程序中更新。

<style name="AlertDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="colorAccent">@color/colorPrimary</item>
</style>

并将主题应用于 AlertDialog.Builder

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

这个答案是最干净的,但仍然是正确的。
Big_Chair

11

如果要更改按钮的文本颜色(正,负,中性),只需添加到自定义对话框样式即可:

<item name="colorAccent">@color/accent_color</item>

因此,您的对话框样式必须如下所示:

<style name="AlertDialog" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="android:textColor">@android:color/black</item>
    <item name="colorAccent">@color/topeka_accent</item>
</style>

6
<style name="AlertDialogCustom" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="android:colorPrimary">#00397F</item>
    <item name="android:textColorPrimary">#22397F</item>
    <item name="android:colorAccent">#00397F</item>
    <item name="colorPrimaryDark">#22397F</item>
</style>

还可以使用appcompat更改按钮和其他文本的颜色:


Theme.AppCompat.Light.Dialog.Alert可以很好地将按钮颜色更改为白色。
Leo K

6
  1. 在应用程序的主题/样式中,添加以下行:

    <item name="android:buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
    <item name="android:buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
    <item name="android:buttonBarNeutralButtonStyle">@style/NeutralButtonStyle</item>
  2. 然后添加以下样式:

    <style name="NegativeButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
        <item name="android:textColor">@color/red</item>
    </style>
    
    <style name="PositiveButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
        <item name="android:textColor">@color/red</item>
    </style>
    
    <style name="NeutralButtonStyle" 
    parent="Widget.MaterialComponents.Button.TextButton.Dialog">
        <item name="android:textColor">#00f</item>
    </style>

使用此方法无需在AlertDialog构建器中设置主题。


4

恰如其分:

按钮的颜色(以及整个样式)还取决于当前主题,当您使用其中一个

android.app.AlertDialog.Builder builder = new AlertDialog.Builder()

要么

android.support.v7.app.AlertDialog.Builder builder = new AlertDialog.Builder()

(最好使用第二个)


3

这是您的操作方法:简单方法

// Initializing a new alert dialog
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(R.string.message);
builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        doAction();
    }
});
builder.setNegativeButton(R.string.cancel, null);

// Create the alert dialog and change Buttons colour
AlertDialog dialog = builder.create();
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface arg0) {
        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(getResources().getColor(R.color.red));
        dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(getResources().getColor(R.color.blue));
        //dialog.getButton(AlertDialog.BUTTON_NEUTRAL).setTextColor(getResources().getColor(R.color.black));
    }
});
dialog.show();

1

对我来说不一样,我使用了按钮主题

<style name="ButtonLight_pink" parent="android:Widget.Button">
      <item name="android:background">@drawable/light_pink_btn_default_holo_light</item>
      <item name="android:minHeight">48dip</item>
      <item name="android:minWidth">64dip</item>
      <item name="android:textColor">@color/tab_background_light_pink</item>
    </style>

而且因为

android:textColor

那里是白色的……我没有看到任何按钮文本(对话框按钮基本上也是按钮)。我们去了,更改它,修复它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.