【问题标题】:How to change the style of a ListPreference popup dialog?如何更改 ListPreference 弹出对话框的样式?
【发布时间】:2018-12-05 13:35:39
【问题描述】:

我正在尝试更改 ListPreference 的弹出对话框的样式,就像我在 answer 中看到的那样。例如,我希望对话框具有不同的背景颜色。

到目前为止,我尝试通过以下方式应用我的自定义样式:

<item name="android:dialogTheme">@style/AlertDialogStyle</item>
<item name="android:alertDialogTheme">@style/AlertDialogStyle</item>
<item name="android:alertDialogStyle">@style/AlertDialogStyle</item>
<item name="android:dialogPreferenceStyle">@style/AlertDialogStyle</item>


<style name="AlertDialogStyle" parent="AlertDialog.AppCompat">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:textColor">@color/lightGrey</item>
    <item name="android:background">@color/cardBackground</item>
    <item name="android:popupBackground">@color/cardBackground</item>
    <item name="android:windowBackground">@color/cardBackground</item>
    <item name="android:itemBackground">@color/cardBackground</item>
</style>

但是我的样式仍然没有应用/背景颜色没有改变。

这就是我的 ListPreference 的弹出对话框现在的样子:

这是我要存档的颜色主题(基本上与我用于其他对话框的主题相同):


为了快速重现我的问题 -> 我的项目在 github

【问题讨论】:

  • 您是否考虑过简单地采用自定义视图?
  • 我考虑过,但我不确定这是否是“只是”更改背景颜色和文本颜色的正确方法?

标签: android android-alertdialog listpreference


【解决方案1】:

styles.xml 中使用它并将其添加到基本主题中。此样式将警报对话框替换为材质对话框。

    <style name="AppTheme" parent="Theme.MaterialComponents.NoActionBar">
        <item name="alertDialogTheme">@style/MaterialDialogAlert</item>
        <item name="materialAlertDialogTheme">@style/MaterialDialogAlert</item>
    </style>
    <style name="MaterialDialogAlert" parent="ThemeOverlay.MaterialComponents.Dialog.Alert">
        <item name="android:textColorPrimary">?colorPrimary</item>
        <item name="android:background">?colorSurface</item>
        <item name="buttonBarPositiveButtonStyle">@style/AlertButtonStyle</item>
        <item name="buttonBarNegativeButtonStyle">@style/AlertButtonStyle</item>
        <item name="buttonBarNeutralButtonStyle">@style/AlertButtonStyle</item>
    </style>

【讨论】:

    【解决方案2】:

    我认为您正在混合标记中的内容。 alertDialogStyle 和 alertDialogTheme 都不同。

    自定义警报对话框主题你应该创建你的对话框主题,一个可能应该扩展@android:style/Theme.Dialog.Alert的主题

    <item name="android:dialogTheme">@style/dialogAlertTheme</item>
    <item name="android:alertDialogTheme">@style/dialogAlertTheme</item>
    <item name="android:alertDialogStyle">@style/AlertDialogStyle</item>
    <item name="android:dialogPreferenceStyle">@style/AlertDialogStyle</item>
    
    <style name="dialogAlertTheme" parent="@android:style/Theme.Dialog.Alert">
        <item name="android:windowBackground">[...]</item>
        [...]
    </style>
    
    <style name="AlertDialogStyle" parent="AlertDialog.AppCompat">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:textColor">@color/lightGrey</item>
        <item name="android:background">@color/cardBackground</item>
        <item name="android:popupBackground">@color/cardBackground</item>
        <item name="android:windowBackground">@color/cardBackground</item>
        <item name="android:itemBackground">@color/cardBackground</item>
    </style>
    

    注意 1。 自定义警报对话框样式仅限于提供(背景)drawable。

    注意-2.自定义警报对话框主题会打开一个方法来提供诸如 windowBackground、windowTitleStyle 等属性,但您需要一个支持主题的 alertDialogThem 属性/项目的 Android 版本 p>

    您的答案解释: 如果您从 android:alertDialogTheme 中删除 android:,为什么它会起作用

    <item name="alertDialogTheme">@style/AlertDialogStyle</item>
    

    现在它是覆盖 AlertDialog 样式的标准方式。它是 lib 的一部分,因为 AlertDialog 不会使用主主题中的强调色,但自 v24.2.0.0 以来已被删除,因为 Android 团队修复了此行为。

    问题参考: https://github.com/Gericop/Android-Support-Preference-V7-Fix/issues/52#issuecomment-255759293

    更改参考: https://github.com/Gericop/Android-Support-Preference-V7-Fix/commit/a6082cb0a508f5e0305a626c9a2a841e943ef8f6#diff-483bbb12192b1b74adadc9b4076b203b

    【讨论】:

    • 如果你扩展你的答案并解释为什么要使用 alertDialogTheme 而不是 android:alertDialogTheme 我会奖励你赏金。
    • 感谢更新我知道我在这里混合了一些东西。但我的问题的根本原因是我不清楚为什么我需要从android:alertDialogTheme 中删除android:(如我的回答中所示)。你能指出一些描述这一点的文档吗?
    【解决方案3】:

    回答我自己的问题。最后就这么简单的替换:

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

    <item name="alertDialogTheme">@style/AlertDialogStyle</item>
    

    【讨论】:

    • 并添加适当的 appcompat 项
    • 在哪里更换?
    【解决方案4】:

    取决于你会调用多少时间/地点,你可以创建一个 DialogFragment 来处理这个。

    DialogFragment 可以这么简单:

    public Dialog onCreateDialog(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            mText = getArguments().getString("remark");
            // Use the Builder class for convenient dialog construction
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            //builder.setTitle("Remarks");
            builder.setMessage(mText);
            builder.setPositiveButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });
            return builder.create();
        }
    

    这将自动创建一个带有取消按钮的简单对话框。 要添加样式:,在super.onCreate之后添加:

    setStyle(DialogFragment.STYLE_NO_TITLE, R.style.AlertDialogStyle);
    

    或者您可以通过创建自己的布局来做更多的自定义:fragment_dialogfragment_alert.xml 然后在类中,使用 onCreateView 而不是 onCreateDialog

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_dialogfragment_alert, container, false);
    ...
    }
    

    【讨论】:

    • 1) 所以你建议创建一个自定义 ListPreference 我覆盖 onCreateDialog 来设置我的 DialogStyle?
    • 2) 你写Depend on how many time/place will you call this。你能描述一下为什么它重要吗?我称之为多少次/地点?
    • @IIIIIIIIIIIIIIIIIIIIIIIII 1 )我更喜欢DialogFragment 而不是ListPreference,因为ListPreference 没有为我的对话框提供足够的自定义更改 2) 因为它为更改提供了更灵活的对话框,您可以重用通过将不同的数据传递给片段来进行对话。当然如果你只用一个也没影响
    • 但我不能在PreferenceScreen 中使用DialogFragment 对吧?所以我看不出你的解决方案对我有什么帮助:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多