使用支持库v24.2.1的AlertDialog按钮文本颜色

10

我在使用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 的应用程序API中,对话框按钮的颜色是使用colorAccent着色的,但在API 24中,这种行为不再存在(文本是黑色的,应该是橙色的)。请参见以下截图

有没有人知道如何将accentColor重新应用到按钮上呢? 谢谢。

2个回答

15
对于某些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下,可以找到一个nicola.v...@icapps.com的示例,它使用Widget.AppCompat.Button.ButtonBar.AlertDialog作为按钮的父样式:在Android N上未应用colorAccent到AlertDialog按钮


@0X0nosugar,我问这个问题是因为最近支持库的更新似乎改变了实现方式。很让人沮丧的是我的样式按钮会随机消失。我设置了一个强调颜色是有原因的。 - Austyn Mahoney
@Austyn Mahoney - 我完全同意:如果幸运的话,SO是一个可能会偶然发现如此重要信息的来源,这真是令人沮丧。但为了确保我理解正确:在运行N的设备上,强调颜色是否消失?还是某个较低的API级别,你只改变了库版本? - Bö macht Blau
1
@0X0nosugar 我不是很确定,但按钮似乎只在7.x上具有默认样式,因此当使用Support Library v24.2.x时,弹出对话框的重点颜色可能未被正确应用。我们实际上使用我们的重点颜色设置了一个主题对话框样式,并解决了对话框问题,无需使用buttonBarStyle - Austyn Mahoney
1
无边框按钮样式会在按钮中添加额外的空间。请改用此解决方案:https://code.google.com/p/android/issues/detail?id=220699#c12 - kirtan403
@kirtan403 - 感谢你提供的链接!我会编辑我的帖子。 - Bö macht Blau
显示剩余4条评论

1

请确保你导入了正确的 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;
}

and the style:

<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上测试过。


我刚刚使用模拟器进行了测试:我的一个应用程序和OP的代码都在Nougat上运行时使用主要文本颜色作为按钮文本颜色。这可能是另一个Nougat的错误 :( 昨天有人发布了一个关于动画问题的帖子,今天又出现了这个... - Bö macht Blau
因此,我建议您在此类事情上使用支持库,因为它独立于系统版本风格。 - R. Zagórski
谢谢,但这正是我正在做的 :) 你在Nougat上测试过你的答案吗?我真的认为这是一个bug。非AppCompat AlertDialog:没有问题。DialogFragment:没有问题。AppCompat AlertDialog:Button上的文本颜色是textColorPrimary(来自对话框样式)。如果您可以使用您发布的代码和OP的style.xml运行自己的测试,并告诉我们您是否可以确认问题,那将是很好的。 - Bö macht Blau
我无法确认。它在Nougat上运行得非常完美,这就是我发布答案的原因。也许品牌手机会导致问题,因为它的系统可能不完全符合谷歌版本。 - R. Zagórski
谢谢 - 我只能在模拟器上进行测试,所以也许是Nougat模拟器出了问题。我很高兴知道这个情况,否则我将不得不尽快将我的应用程序中的所有AlertDialog更改为DialogFragments。 - Bö macht Blau
我已经在我的Nexus 5X上使用API 24和模拟器上测试过了。行为是相同的。文本仍然是黑色的。我正在导入:android.support.v7.app.AlertDialog,并在Builders构造函数中设置样式并没有改变任何东西。 - Christian Leicht Jørgensen

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