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

how to change the button text color on AlertDialog globally using style?

在 android 哦,当我这样做时:

  <style name="MyTheme" parent="@android:style/Theme.Material.Light.NoActionBar"> 

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

  </style>

我的提醒对话框的文本按钮颜色改变了,但这在棒棒糖下不起作用。更糟糕的是,棒棒糖会更改警报对话框标题的颜色。

如何从 kitkat 到 android O 我可以全局更改所有 alertdialog 按钮的字体颜色?

为您的自定义警报对话框创建 Java Class

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写一个主题,并设置为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>

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