PreferenceFragmentCompat需要设置preferenceTheme

Int*_*ons 114 android android-fragments android-support-library preferencefragment preference-v7

使用v7首选项支持库中的新PreferenceFragmentCompat:http://developer.android.com/tools/support-library/features.html#v7-preference,我收到此错误

E  java.lang.IllegalStateException: Must specify preferenceTheme in theme
E      at android.support.v7.preference.PreferenceFragmentCompat.onCreate(PreferenceFragmentCompat.java:202)
Run Code Online (Sandbox Code Playgroud)

应该设置什么主题?

更新:我尝试过使用

<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>

正如@Bogato所建议的那样,它看起来并不正确,即使在Lollipop上也看起来非常Holo.

支持库:

在此输入图像描述

原生偏好:

在此输入图像描述

Ger*_*ssy 159

The sample project can be found here

The bugfix is available as a gradle dependency

下载

Now one can use the library pretty easy. Here are quickest way to do so, but you should check out the README for more info.

1. Update your module's gradle file:

compile 'com.takisoft.fix:preference-v7:27.0.0.0'

2. Use the appropriate class as your fragment's base

You can use either PreferenceFragmentCompat or PreferenceFragmentCompatDividers.

(Watch out for the appropriate package name when importing PreferenceFragmentCompat!)

3. Use the appropriate theme

Set your containing Activity's theme to a variant of @style/PreferenceFixTheme, like NoActionBar, Light, etc.

For more info and usage tips, go to the project's page.


PS在本节中,您可以找到导致创建库的详细解决方案,但我决定将其删除,因为它可能会令人困惑.如果您对这些步骤感到好奇,您仍然可以在此答案的修订历史中找到它们.

  • 这是荒唐的.从头开始创建一个偏好片段比找到解决所有版本所需的所有错误,变通方法和测试所需的方法花费更少的时间. (21认同)
  • 默认文本大小太大,我尝试使用您指出的这些样式修改它但没有成功.您是否设法调整文本大小? (6认同)
  • 我正在尝试将材料设计放在那里,但并不是真的成功......我在这个过程中发现的是v7首选包完全缺少材料主题样式,布局和其他文件.同时,v14包含其中的一些,但v14的问题在于它扩展了原生Fragment,而不是支持.我认为谷歌在这里犯了一个非常大的错误,希望他们尽快解决它... (4认同)
  • 您还应该提到,如果使用打开的对话框旋转,PreferenceFragmentCompat会崩溃.https://code.google.com/p/android/issues/detail?id=186160 (2认同)

小智 45

您必须在首选项活动的主题中指定preferenceTheme.

例如 :

<style name="SettingsTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>
Run Code Online (Sandbox Code Playgroud)

PreferenceThemeOverlay是preference-v7支持库附带的默认主题.

  • 这有效,但看起来不对.偏好元素的字体太大(在Android 4.1和5.1上测试). (14认同)
  • 我选择了这个作为正确答案,因为它是第一个说出正确主题的人.但是,需要修复支持库,以便首选项使用材料设计,具体取决于https://code.google.com/p/android/issues/detail?id=183376 (3认同)

Sri*_*ddy 35

似乎谷歌解决了这个问题.我用偏好v14-support版本25.3.1测试了这个

1)添加implementation 'com.android.support:preference-v14:25.3.1'到Gradle.

2)添加PreferenceThemeOverlay.v14.Material到样式而不是PreferenceThemeOverlay.

<style name="AppTheme.SettingsTheme" parent="AppTheme.NoActionBar">
    <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
</style>
Run Code Online (Sandbox Code Playgroud)

3)最后,将样式添加到Manifest

android:theme="@style/AppTheme.SettingsTheme"
Run Code Online (Sandbox Code Playgroud)


Gab*_*tti 14

要使用PreferenceFragmentCompat,您必须preferenceTheme在主题中进行设置:

<style name="AppTheme" parent="@style/Theme.AppCompat.Light">
  ...
  <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以自定义preferenceTheme用于为每种首选项类型设置的布局样式,而不会影响Activity的其他部分.


Pan*_*che 14

我刚刚在主题中添加了这一行,它在API 19及更高版本上运行完美.

<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
Run Code Online (Sandbox Code Playgroud)

  • 这是最简单,最有效的解决方案,不需要额外的依赖.应该是接受的答案恕我直言,现在大多数应用程序是min API 14+ (3认同)
  • 添加com.android.support:preference-v14:到build.gradle (3认同)