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

时间:2015-01-15 14:29:29

标签: android android-layout dialog android-5.0-lollipop textcolor

我的应用中有很多提醒对话框。这是默认布局,但我在对话框中添加正负按钮。因此按钮获得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的默认绿色。

非常感谢

Custom dialog with green button

14 个答案:

答案 0 :(得分:163)

这是使用样式执行此操作的自然方式:

如果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>

AlertDialogTheme

中使用AppTheme
<item name="alertDialogTheme">@style/AlertDialogTheme</item>

或构造函数

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

答案 1 :(得分:143)

您可以先尝试创建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_POSITIVE更改为AlertDialog.BUTTON_NEGATIVE以反映您问题的变化。虽然很奇怪&#34; OK&#34;按钮将是一个负面按钮。通常它是正面按钮。

答案 2 :(得分:109)

按钮和其他文字的颜色也可以通过主题改变:

  

值-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>

结果:

Dialog Date picker

答案 3 :(得分:76)

最简单的解决方案是:

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

答案 4 :(得分:14)

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

基本方式

如果您只想更改活动,请在alertDialog.show();

之后写下以下两行
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(getResources().getColor(R.color.colorPrimary));
alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(getResources().getColor(R.color.colorPrimaryDark));

<强>推荐

我建议在AlertDialog中为styles.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);

答案 5 :(得分:9)

  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构建器中设置主题。

答案 6 :(得分:8)

如果您想更改按钮文字颜色(正面,负面,中性),只需添加到您的自定义对话框样式:

<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>

答案 7 :(得分:5)

<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更改按钮和其他文本的颜色:

答案 8 :(得分:5)

使用styles.xml(值)

非常简单的解决方案,根据您的选择更改 colorPrimary,它将更改警报框按钮文本的颜色。

<style name="MyAlertDialogStyle" parent="android:Theme.Material.Dialog.Alert">


        <!-- Used for the buttons -->
        <item name="colorAccent">@android:color/white</item>
        <!-- Used for the title and text -->
        <item name="android:textColorPrimary">@color/black</item>

        <!-- Used for the background -->
        <item name="android:background">#ffffff</item>
        <item name="android:colorPrimary">@color/white</item>
        <item name="android:colorAccent">@color/white</item>
        <item name="android:windowEnterAnimation">@anim/bottom_left_enter</item>
    </style>

替代方案(使用 Java)

 @SuppressLint("ResourceAsColor")
            public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {

                AlertDialog dialog = new AlertDialog.Builder(view.getContext(), R.style.MyAlertDialogStyle)

                        .setTitle("Royal Frolics")
                        .setIcon(R.mipmap.ic_launcher)
                        .setMessage(message)
                        .setPositiveButton("OK", (dialog1, which) -> {
                            //do nothing
                            result.confirm();
                        }).create();

                Objects.requireNonNull(dialog.getWindow()).getAttributes().windowAnimations = R.style.MyAlertDialogStyle;
                dialog.show();
                
                dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(R.color.white);
                return true;

            }

答案 9 :(得分:4)

正如旁注:

按钮的颜色(以及整个样式)也取决于当前主题,使用时可能会有所不同

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

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

(最好使用第二个)

答案 10 :(得分:4)

操作方法如下:

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

答案 11 :(得分: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>

因为

  

机器人:文字颜色

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

答案 12 :(得分:1)

Kotlin 2020:非常简单的方法

使用dialog.show()后:

dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(ContextCompat.getColor(requireContext(), R.color.yourColor))

答案 13 :(得分:0)

我们可以创建扩展函数并在 dialog.show() 之后调用扩展函数来自定义 Alert Dialog 按钮颜色。

fun AlertDialog.makeButtonTextGrey() {
this.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(ContextCompat.getColor(context, R.color.blue))
this.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(ContextCompat.getColor(context, R.color.blue))
}

用法:

dialog.show()
dialog.makeButtonTextGrey()