【问题标题】:Style applied to an AlertDialog not working correctly应用于 AlertDialog 的样式无法正常工作
【发布时间】:2023-03-19 01:11:01
【问题描述】:

我被要求将我们应用中的警报对话框的外观与应用主题使用的外观相匹配。
我设法将一种样式应用于应用程序中的所有警报对话框,并将其用作应用程序主题的一部分,但在某些情况下该样式未正确应用。

例如,当警报对话框包含“单一选择列表”作为其消息时,就会发生这种情况。
标题看起来不错,背景和按钮栏也不错,但列表本身就有问题。
起初,单选按钮以及它们的文字描述都是黑色的,好像 android 使用的是默认颜色。

通过使用这些属性,我设法为单选按钮着色:

<item name="android:colorControlNormal">@color/text_secondary</item>
<item name="android:colorControlActivated">@color/text_secondary</item>  

但是文本颜色仍然是黑色,我已经尝试了 EVERY android 公开的所有可能的文本颜色属性。

看起来像这样:

现在这是为警报对话框定义的完整样式:

<style name="GenericAlertDialog.Alter" parent="Theme.AppCompat.Light.Dialog.Alert">

    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
    <item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
    <item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>

    <item name="android:windowTitleStyle">@style/DialogTitle</item>
    <item name="android:textColor">@color/text_secondary</item>
    <item name="android:textColorPrimary">@color/primary</item>
    <item name="android:background">@color/window_background</item>
    <item name="android:colorAccent">@color/accent</item>

    <item name="android:textColorAlertDialogListItem">@color/text_secondary</item>

    <!--<item name="android:textColorSecondary">@color/text_secondary</item>-->

    <item name="android:colorControlNormal">@color/text_secondary</item>
    <item name="android:colorControlActivated">@color/text_secondary</item>

</style>

这是我的主题定义:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

    <item name="android:windowBackground">@color/window_background</item>

    <item name="android:colorPrimary">@color/primary</item>
    <item name="android:colorAccent">@color/accent</item>

    <item name="android:textColorPrimary">@color/text_primary</item>
    <item name="android:textColorSecondary">@color/text_secondary</item>
    <item name="android:textColorHint">@color/text_hint</item>

    <item name="android:buttonStyle">@style/GenericButton</item>
    <item name="android:checkboxStyle">@style/GenericCheckBox</item>

    <item name="android:alertDialogTheme">@style/GenericAlertDialog</item>
    <item name="alertDialogTheme">@style/GenericAlertDialog</item>

</style>

这是我用来创建自定义警报对话框的代码:

AlertDialog.Builder dialogBuilder = null;
    try
    {
        dialogBuilder = new AlertDialog.Builder(i_OwnerActivity, R.style.GenericAlertDialog_Alter);
        LayoutInflater layoutInflater = i_OwnerActivity.getLayoutInflater();

        // Inflate the dialog's custom title view and set it's text to the matching one to this class
        View customTitleView = layoutInflater.inflate(R.layout.dialog_title, null);
        TextView customTitleTextView = (TextView) customTitleView.findViewById(R.id.DialogTitleText);

        // Set text of customTitleView

        dialogBuilder.setCustomTitle(customTitleView);

        // Create an event handler for clicking on the negative button
        dialogBuilder.setNegativeButton(R.string.action_dialog_negative_cancel, new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface i_Dialog, int i_Which)
            {
                // Do Something
            }
        });
    } catch (Exception e)
    {
        LogUtils.logException(AlterDialogUtils.class, e);
    }
    return dialogBuilder;

最后,这是我用来创建带有“单一选择列表”的警报对话框的代码:

dialogBuilder.setSingleChoiceItems(R.array.squelch_modes, m_InitialState, new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface dialog, int which)
            {
                // Do Something
            }
        });

我做错了什么?如何更改文本的颜色?

值得一提的是,我正在使用 AppCompat 的 AlertDialog。

【问题讨论】:

    标签: java android android-alertdialog android-styles textcolor


    【解决方案1】:

    刚刚发现这个带有Google 的旧帖子,但由于没有答案,我将添加我的案例中的诀窍:

    从您的alertdialog style 中的textColorAlertDialogListItem 中删除android: 前缀

    <item name="textColorAlertDialogListItem">@color/text_secondary</item>
    

    我猜这是因为父母是AppCompat theme,但我不确定。我仍然以我的风格添加了(with and without prefix)...

    【讨论】:

      【解决方案2】:

      我知道可能已经晚了...但这是您的答案:AppCompat 支持库中的android.support.v7.app.AlertDialog 默认情况下使用this 布局(除非您提供自己的适配器)用于singleChoiceDialog:

      <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
                       android:id="@android:id/text1"
                       android:layout_width="match_parent"
                       android:layout_height="wrap_content"
                       android:minHeight="?attr/listPreferredItemHeightSmall"
                       android:textAppearance="?android:attr/textAppearanceMedium"
                       android:textColor="?attr/textColorAlertDialogListItem"
                       android:gravity="center_vertical"
                       android:paddingLeft="@dimen/abc_select_dialog_padding_start_material"
                       android:paddingRight="?attr/dialogPreferredPadding"
                       android:paddingStart="@dimen/abc_select_dialog_padding_start_material"
                       android:paddingEnd="?attr/dialogPreferredPadding"
                       android:drawableLeft="?android:attr/listChoiceIndicatorSingle"
                       android:drawableStart="?android:attr/listChoiceIndicatorSingle"
                       android:drawablePadding="20dp"
                       android:ellipsize="marquee" />
      

      用于在主题中进行设置的属性是 singleChoiceItemLayout,因此您可以使用自己的布局覆盖它以获得您想要的任何 UI。

      如果您只想更改文本颜色,只需定义属性textColorAlertDialogListItem,从布局中可以看出它是用于android:textColor 的属性。

      一般来说,当我需要这样的东西时,我会去查看源代码,因为它是可用的。支持库源码可以在here找到,大部分框架源码可以在here找到。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-07
        • 1970-01-01
        相关资源
        最近更新 更多