如何使用自定义主题样式化 DialogPreference?

7
在我的应用程序中,我使用Theme.Holo和Theme.Holo.Light而没有任何问题。当使用Holo主题并单击DialogPreference/ListPreference时,弹出的对话框也带有Holo主题。Holo.Light也是如此。但是当PreferencesActivity使用我的自定义主题(派生自Holo.Light)进行样式设置时,所有对话框都带有Holo.Light主题。我认为在我的主题中缺少某些东西。有人能帮助我吗?非常感谢!
以下是我的主题代码:
  <?xml version="1.0" encoding="utf-8"?>

<!-- Generated with http://android-holo-colors.com -->
<resources xmlns:android="http://schemas.android.com/apk/res/android">

  <style name="GreenTheme" parent="android:Theme.Holo.Light">

    <item name="android:editTextBackground">@drawable/edit_text_holo_light</item>

    <item name="android:autoCompleteTextViewStyle">@style/AutoCompleteTextViewGreenTheme</item>

    <item name="android:listChoiceIndicatorMultiple">@drawable/btn_check_holo_light</item>

    <item name="android:listChoiceIndicatorSingle">@drawable/btn_radio_holo_light</item>

    <item name="android:buttonStyle">@style/ButtonGreenTheme</item>

    <item name="android:imageButtonStyle">@style/ImageButtonGreenTheme</item>

    <item name="android:dropDownSpinnerStyle">@style/SpinnerGreenTheme</item>

    <item name="android:tabWidgetStyle">@style/TabWidgetGreenTheme</item>

    <item name="android:progressBarStyleHorizontal">@style/ProgressBarGreenTheme</item>

    <item name="android:seekBarStyle">@style/SeekBarGreenTheme</item>

    <item name="android:buttonStyleToggle">@style/ToggleGreenTheme</item>

    <item name="android:listChoiceBackgroundIndicator">@drawable/list_selector_holo_light</item>

    <item name="android:activatedBackgroundIndicator">@drawable/activated_background_holo_light</item>

    <item name="android:fastScrollThumbDrawable">@drawable/fastscroll_thumb_holo</item>

    <item name="android:actionBarStyle">@style/ActionBar.Solid.Greenactionbar</item>

    <item name="android:buttonBarButtonStyle">@style/ButtonBarButtonStyleGreenTheme</item>

    <item name="android:preferenceStyle">@style/TimePickerDialogFragmentGreen</item>
  </style>

      <style name="TimePickerDialogFragmentGreen" parent="@android:style/Theme.Holo.Light.Dialog">
         <item name="android:editTextBackground">@drawable/edit_text_holo_light</item>

    <item name="android:autoCompleteTextViewStyle">@style/AutoCompleteTextViewGreenTheme</item>

    <item name="android:listChoiceIndicatorMultiple">@drawable/btn_check_holo_light</item>

    <item name="android:listChoiceIndicatorSingle">@drawable/btn_radio_holo_light</item>

    <item name="android:buttonStyle">@style/ButtonGreenTheme</item>

    <item name="android:imageButtonStyle">@style/ImageButtonGreenTheme</item>

    <item name="android:dropDownSpinnerStyle">@style/SpinnerGreenTheme</item>

    <item name="android:tabWidgetStyle">@style/TabWidgetGreenTheme</item>

    <item name="android:progressBarStyleHorizontal">@style/ProgressBarGreenTheme</item>

    <item name="android:seekBarStyle">@style/SeekBarGreenTheme</item>

    <item name="android:buttonStyleToggle">@style/ToggleGreenTheme</item>

    <item name="android:listChoiceBackgroundIndicator">@drawable/list_selector_holo_light</item>

    <item name="android:activatedBackgroundIndicator">@drawable/activated_background_holo_light</item>

    <item name="android:fastScrollThumbDrawable">@drawable/fastscroll_thumb_holo</item>

    <item name="android:actionBarStyle">@style/ActionBar.Solid.Greenactionbar</item>

    <item name="android:buttonBarButtonStyle">@style/ButtonBarButtonStyleGreenTheme</item>
    </style>
</resources>

但是当使用我的自定义主题对PreferencesActivity进行样式设置时,该主题派生自Holo.Light,所有对话框都会使用Holo.Light主题。你期望发生什么,特别是当你从Theme.Holo.Light.Dialog继承时!?对于DialogPrefrence,首选项由dialogPreferenceStyle声明,它指向Preference.Holo.DialogPreference。该样式受限,因此您需要制作自己的DialogPreference - user
2个回答

5
我发现这个答案虽然格式不太规范但是非常好。要点是DialogPreference是没有使用 theme 参数创建的AlertDialog,这意味着它们将应用android:alertDialogTheme指向的任何主题。因此,我扩展了我的主题,使对话框具有主题:
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <item name="colorPrimary">@color/yellow_500</item>
        <item name="colorPrimaryDark">@color/yellow_a700</item>
        <item name="colorAccent">@color/purple_400</item>
        <item name="android:alertDialogTheme">@style/DialogTheme</item>
    </style>

    <style name="DialogTheme" parent="Theme.AppCompat.Light.Dialog">
        <item name="colorPrimary">@color/yellow_500</item>
        <item name="colorPrimaryDark">@color/yellow_a700</item>
        <item name="colorAccent">@color/purple_400</item>
        <item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
    </style>

</resources>

AppTheme 中的 colorPrimarycolorPrimaryDarkcolorAccent 是我想要应用于对话框的颜色。

请注意,我需要使用 android:windowMinWidthMinor 来防止对话框在水平方向上折叠。


1
我阅读并尝试了很多解决方案,但这个有效。感谢您的贡献。我希望这能为其他人节省时间,不要像我一样浪费时间在这么简单的事情上。 - snapfractalpop
@snapfractalpop 感谢你的赞美之词!如果我没记错,这实际上是我创建这个账户的答案 :) 很高兴这对你有帮助。干杯! - dtk

0

我有澄清问题,但由于低评级无法提问。因此:
1.您的第一个样式是否正常工作?
2.您确定@android:style/Theme.Holo.Light.Dialog主题具有您在TimePickerDialogFragmentGreen中声明的所有项目吗?例如:

<item name="android:tabWidgetStyle"> @style/TabWidgetGreenTheme</item>


3. 你尝试过Luksprog提出的想法吗?

最后:我使用类似的方法为我的EditText创建自定义样式:

 <style name="EditTextStyle" parent="@style/Indents">
 <item name="android:textColor">@android:color/black</item>
 <item name="android:background">@android:color/white</item>
 <item name="android:textColorHint">@android:color/darker_gray</item>
 <item name="android:textSize">14sp</item>
</style>
<style name="Indents" parent="@style/Margins">
    <item name="android:paddingBottom">@dimen/activity_vertical_padding</item>
    <item name="android:paddingTop">@dimen/activity_vertical_padding</item>
</style>
<style name="Margins">
    <item name="android:layout_marginTop">@dimen/activity_vertical_margin </item>
    <item name="android:layout_marginBottom">@dimen/activity_vertical_margin </item>
    <item name="android:layout_marginLeft">@dimen/activity_horizontal_margin </item>
    <item name="android:layout_marginRight">@dimen/activity_horizontal_margin </item>
</style>

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