Style applied to an AlertDialog not working correctly

夙愿已清 提交于 2020-06-23 03:44:33

问题


I've been asked to match the look of an Alert Dialog in our app to the one used by the app's theme.
I managed to apply a style to all Alert Dialogs in the app using it as part of the app's theme, but there are situations where the style is not applying correctly.

It happens for example when the Alert Dialog contains a 'Single Choice List' as its' message.
The title looks fine, so is the background and the button bar, but the list itself is problematic.
At first, the radio buttons as well as their textual description were black colored, as if android is using the default color.

I somehow managed to color the radio buttons as I wish, by using these attributes:

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

But the text color still remains black, and I've tried EVERY possible text color attribute exposed by android.

It looks like this:

Now this is the full style defined for the Alert Dialogs:

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

This is my Theme definition:

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

This is the code I'm using to create a custom Alert Dialog:

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;

And finally, here's the code I'm using to create an Alert Dialog with a 'Single Choice List':

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

What am I doing wrong? How can I change the color of the text?

It is also worth saying that I'm using AppCompat's AlertDialog.


回答1:


Just found this old post with Google, but since there is no answer I will add what did the trick in my case:

remove the android: prefix from the textColorAlertDialogListItem in your alertdialog style

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

I guess that's because of the parent being an AppCompat theme, but I am not sure about this. I still added both (with and without prefix) in my style...




回答2:


I know it's probably late... but here's your answer: android.support.v7.app.AlertDialog in AppCompat support library use this layout by default (unless you provide your own adapter) for 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" />

The attribute used to set this up in the theme is singleChoiceItemLayout so you can override it with your own layout to get whatever UI you want.

If you just want to change the text color just define the attribute textColorAlertDialogListItem as you can see from the layout it's the one used for android:textColor.

In general when I need something like this i go and look at the source code since it is available. The support libraries source code can be found here, while most of the framework source code can be find here.



来源:https://stackoverflow.com/questions/35904684/style-applied-to-an-alertdialog-not-working-correctly

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!