如何使用样式全局更改AlertDialog中按钮的文本颜色?

3
在安卓 O 版本中,当我执行以下操作时:
  <style name="MyTheme" parent="@android:style/Theme.Material.Light.NoActionBar"> 

    <item name="android:textColor">#ff0000</item>

  </style>

我的AlertDialog中的文本按钮颜色发生了变化,但在Lollipop版本下无法工作。更糟糕的是,在Lollipop版本中,它会改变AlertDialog标题的颜色。

从KitKat到Android O,我如何全局更改所有AlertDialog按钮的字体颜色?


你能添加AlertDialog的代码吗? - chetan mahajan
@chetanmahajan 我不想碰弹出对话框代码,只想改样式。我这么做:mDatePickerDialog = new DatePickerDialog(context, null/listener/, 2000/年份/, 1/月份/, 1/日期/); - zeus
3个回答

4

使用MaterialComponents主题和MaterialAlertDialogBuilder,您可以在应用程序主题中使用materialAlertDialogTheme属性全局定义样式。

示例:

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
   <item name="materialAlertDialogTheme">@style/My_MaterialAlertDialog</item>
</style>

接下来您可以定义一个自定义样式:

  <style name="My_MaterialAlertDialog" parent="@style/ThemeOverlay.MaterialComponents.MaterialAlertDialog">
    <!-- Style for positive button -->
    <item name="buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
    <!-- Style for negative button -->
    <item name="buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
    <!-- Style for neutral button -->
    <item name="buttonBarNeutralButtonStyle">@style/NeutralButtonStyle</item>
  </style>

使用以下定义的按钮样式:

  <style name="PositiveButtonStyle" parent="@style/Widget.MaterialComponents.Button">
    <item name="android:textColor">#FFFFFF</item>
    <item name="backgroundTint">@color/primaryDarkColor</item>
  </style>

  <style name="NegativeButtonStyle" parent="@style/Widget.MaterialComponents.Button.TextButton.Dialog">
    <item name="android:textColor">@color/primaryDarkColor</item>
  </style>

  <style name="NueutralButtonStyle" parent="@style/Widget.MaterialComponents.Button.TextButton.Dialog">
    ....
  </style>

使用库的版本1.1.0,您还可以使用自定义样式中的materialThemeOverlay直接覆盖默认颜色:
  <style name="My_MaterialAlertDialog" parent="@style/ThemeOverlay.MaterialComponents.MaterialAlertDialog">
      <item name="materialThemeOverlay">@style/DialogButtonOverlay</item>
  </style>

  <style name="DialogButtonOverlay">
    <item name="colorPrimary">@color/...</item>
  </style>

不起作用。我正在使用'com.google.android.material:material:1.1.0-alpha02'。 - Abraham Mathew
@AbrahamMathew 使用1.1.0-beta02版本。 - Gabriele Mariotti

1
你需要编写一个AlertDialog主题,并将其设置为AppTheme。这将全局更改你的警告对话框主题。
<style name="AppAlertDialog" parent="Theme.AppCompat.Light.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">@color/colorPrimaryText</item>
    <item name="android:backgroundTint">@android:color/transparent</item>
</style>

<style name="PositiveButtonStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
    <item name="android:textColor">@color/colorPrimaryText</item>
    <item name="android:backgroundTint">@android:color/transparent</item>
</style>

<style name="AppTheme" parent="Theme.MaterialComponents.Light">
    ...
    <item name="alertDialogTheme">@style/AppAlertDialog</item>
</style>

0
创建一个Java类来定制你的警告对话框。
public class Dialog {
    private static final int resId = R.layout.dialog_dialog;
    private AlertDialog alertDialog;

    /**
     * Custom Dialog
     *
     * @param context
     * @param titleText
     * @param message
     * @param positiveText
     * @param negativeText
     * @param type
     * @param dialogListener
     */
    public Dialog(final Context context,
                  String titleText,
                  String message,
                  String positiveText,
                  String negativeText,
                  Type type,
                  final DialogListener dialogListener) {
        TextView labelTitle, labelMessage, buttonPositive, buttonNegative;
        View view = LayoutInflater.from(context).inflate(resId, null, false);
        labelTitle = view.findViewById(R.id.labelTitle);
        labelMessage = view.findViewById(R.id.labelMessage);
        buttonPositive = view.findViewById(R.id.buttonPositive);
        buttonNegative = view.findViewById(R.id.buttonNegative);
        if (Utils.isNotEmpty(titleText)) labelTitle.setText(titleText); //(HMI2Utils.isNotEmpty is a null check
        if (Utils.isNotEmpty(message)) labelMessage.setText(message);
        if (Utils.isNotEmpty(positiveText)) buttonPositive.setText(positiveText);
        if (Utils.isNotEmpty(negativeText)) buttonNegative.setText(negativeText);
        switch (type) {
            case DANGEROUS:
                labelTitle.setTextColor(ContextCompat.getColor(context, R.color.white));
        }
        buttonNegative.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                alertDialog.dismiss();
                dialogListener.onNegativeButtonClick();
            }
        });
        buttonPositive.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                alertDialog.dismiss();
                dialogListener.onPositiveButtonClick();
            }
        });
        Utils.hideSoftKeyboard((Activity) context);
        ContextThemeWrapper ctw = new ContextThemeWrapper(context, R.style.MyDialogTheme);
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ctw);
        alertDialogBuilder.setCancelable(false);
        alertDialogBuilder.setView(view);
        alertDialog = alertDialogBuilder.create();
        Window window = alertDialog.getWindow();
        if (window != null) {
            window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.setStatusBarColor(ContextCompat.getColor(context, R.color.app_theme_color));
        }
        alertDialog.show();
    }

并且适用于XML

<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/rlRoot"
    android:layout_width="736.15px"
    android:layout_height="532.66px"
    tools:ignore="Overdraw">

    <View
        android:id="@+id/focus_eater_dummy"
        android:layout_width="1px"
        android:layout_height="1px"
        android:focusable="true" />

    <ImageView
        android:layout_width="736.15px"
        android:layout_height="532.66px"
        android:scaleType="fitXY"
        android:src="your drawable" />

    <RelativeLayout
        android:id="@+id/container"
        android:layout_width="736.15px"
        android:layout_height="wrap_content"
        android:orientation="vertical"
    >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="67.83px"
            android:layout_marginRight="67.83px"
            android:layout_marginTop="57.855px"
            android:orientation="vertical">

            <TextView
                android:id="@+id/labelTitle"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"

                android:ellipsize="end"
                android:gravity="center_horizontal"
                android:maxLines="1"
                android:text="@string/delete_message_string"
                android:textColor="@color/white"
                android:textSize="24sp" />

            <TextView
                android:id="@+id/labelMessage"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="18px"
                android:lineSpacingExtra="18px"
                android:gravity="center_horizontal"
                android:lineSpacingMultiplier="1"
                android:text="@string/delete_message_string"
                android:textColor="@color/white"

                android:textSize="24sp" />
        </LinearLayout>


    </RelativeLayout>

    <LinearLayout
        android:id="@+id/containerButtons"
        android:layout_width="736.15px"
        android:layout_height="532.66px"
        android:weightSum="2"
        android:gravity="bottom"
        android:layout_gravity="bottom"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/buttonPositive"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="@dimen/margin_button_vertical_dai"

            android:background="@drawable/popup_button_selector"
            android:gravity="center"
            android:textColor="@color/white"
            android:textSize="32sp"
            tools:text="OK" />

        <TextView
            android:id="@+id/buttonNegative"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="100dp"
            android:background="@drawable/popup_button_selector"
            android:gravity="center"
            android:text="Cancel"
            android:textColor="@color/white"
            android:textSize="32sp" />
         </LinearLayout>
         </FrameLayout>

进行自定义更改并调用对话框,如下所示:

                   new Dialog(context,
                    "Title 1",
                    "Message 2",
                    "OK",
                    "Cancel",
                    Dialog.Type.DANGEROUS,
                    new Dialog.DialogListener() {
                        @Override
                        public void onPositiveButtonClick() {
                            //implement Click here
                        }

                        @Override
                        public void onNegativeButtonClick() {
                                 //implement Click here
                        }
                    }
            );
            dialog.dismiss();

不,我不想创建自定义类,我想改变所有现有AlertDialog的设计,我不想重新编程它们。 - zeus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接