【问题标题】:PreferenceFragmentCompat requires preferenceTheme to be setPreferenceFragmentCompat 需要设置 preferenceTheme
【发布时间】:2015-08-18 11:05:35
【问题描述】:

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

支持库:

本地偏好:

【问题讨论】:

标签: android android-fragments android-support-library preferencefragment preference-v7


【解决方案1】:

The sample project can be found here

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

现在可以非常轻松地使用该库。这是执行此操作的最快方法,但您应该查看自述文件以获取更多信息。

1。更新模块的 gradle 文件:

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

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

您可以使用PreferenceFragmentCompatPreferenceFragmentCompatDividers

(在导入PreferenceFragmentCompat时注意适当的包名!)

3。使用合适的主题

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

如需更多信息和使用提示,请转至project's page


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

【讨论】:

  • 默认文本大小太大,我尝试使用您指出的这些样式进行修改,但没有成功。您是否设法调整了文字大小?
  • 我正在尝试将material design放在那里,但并没有真正成功...在此过程中我发现v7偏好包完全缺少material主题样式、布局和其他文件。同时,v14 包含其中的一些,但 v14 的问题在于它扩展了原生 Fragment,而不是支持的 Fragment。我认为谷歌在这里犯了一个非常大的错误,希望他们尽快修复它......
  • 我可能会尝试将材料设计也用于 21 之前的设备,它们现在看起来和原来的一样。
  • 您还应该提到,如果使用打开的对话框旋转,PreferenceFragmentCompat 会崩溃。 code.google.com/p/android/issues/detail?id=186160
  • 这太荒谬了。从头开始制作首选项片段所需的时间比找到解决所有错误、解决方法和测试所需的方法要少,以使这项工作在所有版本上 100% 工作。
【解决方案2】:

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

例如:

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

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

【讨论】:

  • 这行得通,但看起来不对。偏好元素的字体太大(在android 4.1和5.1上测试过)。
  • @mus65 这就是问题所在。我猜我应该使用那个主题,但它看起来很糟糕。我在原始问题中添加了更多详细信息。
  • 我选择了这个作为正确答案,因为它是第一个说要设置正确主题的答案。但是,确实需要修复支持库,以便首选项根据code.google.com/p/android/issues/detail?id=183376 使用材料设计
  • 如何使主题看起来像材料设计?目前它为我显示原生外观......
  • 在下面阅读我的答案。
【解决方案3】:

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) 最后,将样式添加到 Manifest

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

【讨论】:

  • 这个答案的唯一问题是偏好片段将在运行 KitKat 及更低版本的系统上使用材料主题。将preferenceTheme 设置为styles.xml 中的PreferenceThemeOverlay.v14styles-v21.xml 中的PreferenceThemeOverlay.v14.Material 可以解决此问题。
  • @JackMeister 如果您针对 api 级别 14 或更高级别,您应该只使用 v14 版本。当您将 v14 与旧 api 级别一起使用时,主题与旧版本的不兼容可能不是您唯一的问题。
  • @JelmerBrands 当然:您不应该在 API 级别低于 14 的系统上使用 v14 支持库。我的评论假定 minSdkVersion 在 14 到 20 之间。
  • 用 23.4.0 测试过,效果一样好。使用 v14-preference 而不是 v7-preference 是关键。
【解决方案4】:

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

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

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

【讨论】:

【解决方案5】:

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

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

【讨论】:

  • 这是最简单、有效的解决方案,不需要额外的依赖。应该是接受的答案恕我直言,现在大多数应用程序都是 min API 14+
  • Android studio 找不到这个
  • 将 com.android.support:preference-v14: 添加到 build.gradle
【解决方案6】:

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

【讨论】:

  • bruh - 你的答案是金子。外面有这么多,但这个对我来说是 androidx 的。谢谢
【解决方案7】:

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

【讨论】:

    【解决方案8】:

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

    【讨论】:

      【解决方案9】:

      对我最有帮助的网站:Medium

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

      让我知道它是否有效

      【讨论】:

        【解决方案10】:

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

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

        【讨论】:

          【解决方案11】:

          AAPT(Android Asset Packaging Tool) 无法找到某些资源造成的问题。 修复此问题如下:

          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:!*~'
              }
              ...
          }
          

          希望这有帮助:)

          【讨论】:

            【解决方案12】:

            感谢@sergio 的回答,使用&lt;item name="preferenceTheme"&gt;@style/PreferenceThemeOverlay.v14.Material&lt;/item&gt; 而不是&lt;item name="preferenceTheme"&gt;@style/Preference&lt;/item&gt; 对我来说非常有用。

            <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>
            

            【讨论】:

              【解决方案13】:

              放手,使用 API 11+。

              API 7 现在已经快七年了。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-03-08
                • 2016-03-17
                • 2016-11-11
                • 2016-02-12
                • 1970-01-01
                • 2021-12-13
                • 2019-03-03
                相关资源
                最近更新 更多