115

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

支持库:

在此处输入图像描述

原生偏好:

在此处输入图像描述

4

13 回答 13

159

示例项目可以在这里找到

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

下载

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

1. 更新模块的 gradle 文件:

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

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

您可以使用PreferenceFragmentCompatPreferenceFragmentCompatDividers

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

3.使用合适的主题

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

有关更多信息和使用提示,请转到项目页面


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

于 2015-08-20T02:03:42.683 回答
46

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

例如 :

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

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

于 2015-08-18T13:10:47.620 回答
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>

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

android:theme="@style/AppTheme.SettingsTheme"
于 2017-05-29T07:07:14.637 回答
14

要使用PreferenceFragmentCompat你必须preferenceTheme在你的主题中设置:

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

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

于 2015-09-01T06:52:03.203 回答
14

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

<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
于 2017-01-22T03:54:18.527 回答
4

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

于 2017-04-02T09:27:46.397 回答
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 设备

于 2017-03-31T12:09:26.830 回答
1

对我最有帮助的网站:Medium

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

让我知道它是否有效

于 2017-10-06T06:39:37.207 回答
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>
于 2015-08-19T04:39:15.517 回答
0

公认的“Takisoft Fix”看起来相当笨拙,在玩过它之后,我仍然对最终的外观不满意。

如果您需要 API 9+PreferenceFragment支持库,我建议使用Material Preference Support Library 它工作得很好(至少对我来说)。

于 2017-02-24T10:01:24.083 回答
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:!*~'
    }
    ...
}

希望这会有所帮助:)

于 2017-05-09T12:41:42.843 回答
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>
于 2018-03-04T06:29:37.647 回答
-8

放手去使用 API 11+。

API 7 现在已经快七年了。

于 2016-07-16T23:05:09.850 回答