PreferenceFragmentCompat 需要设置 preferenceTheme

PreferenceFragmentCompat requires preferenceTheme to be set

使用 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 所建议,但它看起来不正确,即使在 Lollipop 上看起来也很全息。

支持库:

原生偏好:

您必须在您偏好的 activity 主题中指定 preferenceTheme。

例如:

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

PreferenceThemeOverlay 是 preference-v7 支持库自带的默认主题。

我将 "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>

The sample project can be found here

错误修复可作为 gradle 依赖项使用

现在可以很容易地使用这个库了。这是最快的方法,但您应该查看自述文件以获取更多信息。

1。更新模块的 gradle 文件:

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

2。使用适当的 class 作为片段的基础

您可以使用 PreferenceFragmentCompatPreferenceFragmentCompatDividers

(导入时注意包名正确 PreferenceFragmentCompat!)

3。使用合适的主题

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

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


P.S。在本节中,您可以找到导致创建库的详细解决方案,但我决定将其删除,因为它可能会造成混淆。如果你对这些步骤感到好奇,你仍然可以在这个答案的 revision history 中找到它们。

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

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

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

放手使用API 11+。

API7快七岁了。

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

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

接受的"Takisoft Fix"看起来有点笨拙,玩了之后,我对最终的外观仍然不满意。

如果需要API 9+ PreferenceFragment支持库,推荐使用Material Preference Support Library. 它工作得很好(至少对我来说是这样)。

在 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 设备

将此代码添加到您的 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>

由于AAPT(Android资产打包工具)找不到部分资源,出现该问题。修复问题如下:

1.Copy 资源,这是新的响应资源文件夹所必需的,命名为 res_fw_v7_preference 或其他名称。

2.Using gradle 构建您的应用程序并在 build.gradle(模块的)中添加一些额外的 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:!*~'
    }
    ...
}

希望这对您有所帮助:)

似乎 Google 解决了这个问题。我已经使用首选项 v14-support version 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) 最后,将样式添加到Manifest中

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

对我最有帮助的网站:Medium

作者表明我们需要添加两个包:com.android.support:preference-v7com.android.support:preference-v14,因为第一个包没有样式。

如果有效请告诉我

感谢@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>