3

当我这样做时,在 android O 上:

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

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

  </style>

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

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

4

3 回答 3

3

使用 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>
于 2019-11-04T22:14:41.410 回答
1

您需要为 AlertDialog 编写一个主题并将其设置为 AppTheme。它将全局更改您的 alet 对话框主题。

<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>
于 2019-02-11T15:26:02.517 回答
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();
于 2018-10-16T13:57:46.040 回答