PreferenceFragmentCompat需要preferenceTheme设置


114

使用来自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)

应该设置什么主题?

更新:我尝试使用

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

正如@Bogato所建议的那样,但它看起来不正确,即使在棒棒糖上也看起来很像Holo。

支持库:

在此处输入图片说明

本机首选项:

在此处输入图片说明


2
此处存在有关此文档的错误:code.google.com/p/android/issues/…–
复杂情况

1
我个人认为这些解决方案不值得解决。试试github.com/kolavar/android-support-v4-preferencefragment
MidasLefko 2015年

1
您能否将stackoverflow.com/a/44236460/238753标记为可接受的答案?
山姆

Answers:


159

示例项目可以在这里找到

该错误修复程序可以作为gradle依赖项使用

下载

现在,可以轻松使用该库了。这是最快的方法,但是您应该查看自述文件以了解更多信息。

1.更新模块的gradle文件:

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

2.使用适当的类作为片段的基础

您可以使用PreferenceFragmentCompatPreferenceFragmentCompatDividers

导入时请注意适当的软件包名称PreferenceFragmentCompat

3.使用适当的主题

将您包含的Activity主题设置为的变体@style/PreferenceFixTheme,例如NoActionBar,Light等。

有关更多信息和使用技巧,请转到项目的页面


PS在本节中,您可以找到导致创建该库的详细解决方案,但是我决定删除它,因为它可能会造成混淆。如果您对这些步骤感到好奇,仍可以在此答案的修订历史记录中找到它们。


6
默认文本大小太大,我尝试使用您指出的这些样式进行修改,但没有成功。您是否设法调整了文字大小?
Tinashe

4
我正在尝试将材质设计放在那里,但并没有真正成功……在此过程中,我发现v7首选项包完全缺少材质主题的样式,布局和其他文件。同时,v14包含其中一些,但是v14的问题在于它扩展了本机Fragment,而不是支持的Fragment。我认为Google在这里犯了一个很大的错误,希望他们能尽快解决...
GergelyKőrössy2015年

1
我可能还会尝试对21之前版本的设备进行材料设计,它们现在看起来与原始设计相同。
GergelyKőrössy2015年

2
您还应该提到,如果使用打开的对话框旋转PreferenceFragmentCompat会崩溃。code.google.com/p/android/issues/detail?id=186160
headsvk

21
这是荒唐的。从头开始制作首选项片段所花的时间要比找到使所有版本上的这项功能100%正常运行所需的所有错误,解决方法和测试要少的时间。
爱德华范拉克

46

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

例如 :

<style name="SettingsTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>

PreferenceThemeOverlay是preference-v7支持库随附的默认主题。


14
这可行,但是看起来不对。preferences元素的字体太大(已在android 4.1和5.1上测试)。

@ mus65这就是问题。我猜我应该使用那个主题,但是看起来很糟糕。我在原始问题中添加了更多详细信息。
复杂的

3
我选择这是正确的答案,因为它是第一个说出正确主题的人。但是,支持库确实需要固定,以便首选项根据code.google.com/p/android/issues/detail?id=183376
Intrications

我如何使主题看起来像材料设计?目前,它向我显示了本机外观...
android开发人员

1
请在下面阅读我的答案。
GergelyKőrössy2015年

35

好像Google修复了此问题。我已经使用偏好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>

3)最后,将样式添加到清单中

android:theme="@style/AppTheme.SettingsTheme"

这个答案的唯一问题是,首选项片段将在运行KitKat及更低版本的系统上使用Material主题。设置preferenceThemePreferenceThemeOverlay.v14in styles.xmlPreferenceThemeOverlay.v14.Materialin可以styles-v21.xml解决问题。
杰克·梅斯特

@JackMeister如果只针对api级别14或更高版本,则仅应使用v14版本。将v14与较旧的api级别一起使用时,与较早版本的主题不兼容可能不是唯一的问题。
Jelmer Brands

@JelmerBrands肯定的是:你不应该使用在以下运行14我的评论API级别系统中,V14支持库呈现出minSdkVersion14和20之间
杰克·梅斯特

经过23.4.0测试,效果也一样。关键是使用v14-preference,而不是v7-preference。
user149408 '18

14

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

<style name="AppTheme" parent="@style/Theme.AppCompat.Light">
  ...
  <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>

这样,您可以自定义,preferenceTheme以设置用于每种首选项类型的布局的样式,而不会影响“活动”的其他部分。


确保您在正确的样式中添加了preferenceTheme,并将其设置为活动的主题stackoverflow.com/a/40736138/1572286
Youness

14

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

<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>

3
这是最简单,有效的解决方案,不需要其他依赖项。恕我直言,应该接受的答案,因为大多数应用都是最小API 14+
Louis CAD

Android studio找不到此内容
Denny

3
添加com.android.support:preference-v14:build.gradle
Sofi Software LLC

3

在API 25中对我有用的解决方案。我有这个默认主题:

<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

并添加此行

<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>

PreferenceThemeOverlay已经被定义,我不必包含它。它适用于我自己的Android 4.x和5.x设备


2

将此代码添加到您的styles.xml中,然后根据需要进行修改。它应该工作正常。

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>

<style name="PreferenceThemeOverlay">
    <item name="preferenceScreenStyle">@style/Preference.PreferenceScreen</item>
    <item name="preferenceFragmentStyle">@style/PreferenceFragment</item>
    <item name="preferenceCategoryStyle">@style/Preference.Category</item>
    <item name="preferenceStyle">@style/Preference</item>
    <item name="preferenceInformationStyle">@style/Preference.Information</item>
    <item name="checkBoxPreferenceStyle">@style/Preference.CheckBoxPreference</item>
    <item name="switchPreferenceCompatStyle">@style/Preference.SwitchPreferenceCompat</item>
    <item name="dialogPreferenceStyle">@style/Preference.DialogPreference</item>
    <item name="editTextPreferenceStyle">@style/Preference.DialogPreference.EditTextPreference</item>
    <item name="preferenceFragmentListStyle">@style/PreferenceFragmentList</item>
</style>


1

我在自己的样式中添加了“ preferenceTheme”项目,这似乎可以解决该问题:

   <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
     <item name="android:actionBarStyle">@style/MyActionBarTheme</item>
     <item name="colorPrimary">@color/ColorPrimary</item>
     <item name="colorPrimaryDark">@color/ColorPrimaryDark</item>
     <item name="preferenceTheme">@style/Preference</item>
 </style>

1

对我最有用的网站:

作者显示,我们需要添加两个软件包:com.android.support:preference-v7com.android.support:preference-v14,因为第一个软件包没有样式地分发。

让我知道是否有效


0

公认的“ Takisoft Fix”似乎很笨拙,并且在试用它之后,我仍然对结果外观不满意。

如果您需要API 9+ PreferenceFragment支持库,建议您使用Material Preference支持库 它运行完美(至少对我而言)。


0

发生问题是因为AAPT(Android资产打包工具)找不到某些资源。解决此问题的方法如下:

1.将必要的资源复制到新的响应资源文件夹中,命名为res_fw_v7_preference或其他名称。

2.使用gradle构建您的应用程序并在build.gradle(module's)中添加一些其他AAPT选项,如下所示:

android {
    ...
    aaptOptions {
        additionalParameters '-S',
            'src/main/res_fw_v17_leanback',  // resources in frameworks/support/v17/leanback
            '-S',
            'src/main/res_fw_v7_preference',  // resources in frameworks/support/v7/preference
            '-S',
            'src/main/res_fw_v14_preference',  // resources in frameworks/support/v14/preference
            '-S',
            'src/main/res_fw_v17_preference-leanback',  // resources in frameworks/support/v17/preference-leanback
            '-S',
            'src/main/res_fw_v7_appcompat',  // resources in frameworks/support/v7/appcompat
            '-S',
            'src/main/res_fw_v7_recyclerview',  // resources in frameworks/support/v7/recyclerview
            '-S',
            'src/main/res',  // resources in your application
            '--auto-add-overlay',
            '--extra-packages',
            'android.support.v17.leanback:android.support.v7.preference:android.support.v14.preference:android.support.v17.preference:android.support.v7.appcompat:android.support.v7.recyclerview'
    noCompress 'foo', 'bar'
    ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~'
    }
    ...
}

希望这会有所帮助:)


0

感谢@sergio的回答,<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>而不是 <item name="preferenceTheme">@style/Preference</item>对我有用 。

<style name="IntentTheme" parent="Theme.AppCompat">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:actionModeBackground">@color/fulltransparent</item>
        <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>

-8

放手使用API​​ 11+。

API 7已有近7年的历史了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.