如何更改ListPreference弹出对话框的样式?

时间:2018-06-26 18:40:31

标签: android android-alertdialog listpreference

我正在尝试更改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的弹出对话框的外观:

enter image description here

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

enter image description here


要快速重现我的问题->我的项目位于github

3 个答案:

答案 0 :(得分:5)

回答我自己的问题。最后,它就像替换一样简单:

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

使用

words.groupBy(
  window($"timestamp", "1 day", "5 minutes"),
  $"word"
)

答案 1 :(得分:0)

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

自定义警报对话框主题,您应该创建Dialog主题,该主题可能应该扩展@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。自定义警报对话框样式仅限于提供(背景)可绘制对象。

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

答案解释如果您从android:上删除android:alertDialogTheme

,为什么它会起作用
<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

答案 2 :(得分:-1)

根据您要调用的时间/地点的多少,可以创建一个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);
...
}