AlertDialog 按钮文本颜色与支持库 v24.2.1

AlertDialog button text color with support library v24.2.1

我在使用 AlertDialog 时遇到问题。这些按钮不再使用 accentColor 来设置按钮文本颜色。

我使用的是最新的支持库 v24.2.1。我通过以下方式在 styles.xml 中设置对话框样式:

<style name="Base.Theme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:alertDialogTheme">@style/Widget.DialogStyle</item>
    <item name="alertDialogTheme">@style/Widget.DialogStyle</item>
</style>

并且 Widget.DialogStyle 看起来像这样:

<style name="Widget.DialogStyle" parent="@style/Theme.AppCompat.Light.Dialog.Alert">
    <item name="android:colorAccent" tools:targetApi="lollipop">@color/primaryColor</item>
    <item name="colorAccent">@color/primaryColor</item>
    <item name="android:textColorPrimary">@color/primaryText</item>
    <item name="android:textColor">@color/primaryText</item>
    <item name="android:background">@color/backgroundColor</item>
    <item name="android:textAppearanceLarge">@color/primaryText</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
</style>

在应用程序 API 低于 24 时,对话框按钮使用 colorAccent 着色,但在 API 24 上不再有这种行为(文本为黑色,应为橙色)。见下文screenshot.

有没有人知道如何让按钮上的 accentColor 恢复原样? 谢谢。

确保导入正确 AlertDialog:

import android.support.v7.app.AlertDialog

也尝试使用另一个 AlertDialog.Builder 构造函数来扩充对话框:

android.support.v7.app.AlertDialog.Builder#Builder(android.content.Context, int)

也就是说,第二个参数是对话框的样式:

mDialog = new AlertDialog.Builder(context, R.style.Widget.DialogStyle).create();

编辑:
分享我用来显示警报对话框的代码:

public AlertDialog showSimpleDialog(Context context, String title, String message, String btnOk, DialogInterface.OnClickListener handler) {
    if (mDialog != null && mDialog.isShowing()) {
        mDialog.dismiss();
        mDialog = null;
    }
    mDialog = new AlertDialog.Builder(context, R.style.AppTheme_Dialog).create();
    mDialog.setTitle(title);
    mDialog.setMessage(message);
    mDialog.setButton(DialogInterface.BUTTON_POSITIVE, btnOk, handler);
    mDialog.setCanceledOnTouchOutside(false);
    mDialog.show();
    return mDialog;
}

风格:

<style name="AppTheme.Dialog" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="colorAccent">@color/colorPrimary</item> //blue
    <item name="android:textColorPrimary">@color/primary_text_material_light</item> //black
    <item name="android:windowMinWidthMajor">97%</item>
    <item name="android:windowMinWidthMinor">97%</item>
</style>

而且按钮是蓝色的。在模拟器上测试 API 24.

对于某些 AlertDialog 实现,按钮包含在 ButtonBar 中 并且 的样式来自 buttonBarButtonStyle。因此,您必须覆盖从父主题 (Theme.AppCompat.Light.Dialog.Alert) 继承的设置。

将以下项目添加到 Widget.DialogStyle:

<item name="buttonBarButtonStyle">@style/MyButtonStyle</item>

并添加另一个名为 MyButtonStyle 的样式,如下所示:

<style name="MyButtonStyle" parent="Widget.AppCompat.Button.Borderless">
    <!-- Set background drawable and text size of the buttons here
    <item name="android:background">@color/my_dialog_dark</item>-->
    <item name="android:textSize">18sp</item>

    <!-- this is the button text color!    -->
    <item name="android:textColor">@color/primaryColor</item>
</style>

编辑

感谢 kirtan403 指出这一点:如果 Widget.AppCompat.Button.Borderless 不符合您的要求,您还可以为按钮使用其他父级样式。

可以在 AOSP 问题 220699 下找到使用 Widget.AppCompat.Button.ButtonBar.AlertDialog 作为按钮父样式的 example by nicola.v...@icapps.comcolorAccent 未应用于 Android N 上的 AlertDialog 按钮