PreferenceFragmentCompat需要设置preferenceTheme

使用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所build议的那样,但是看起来不太合适,即使在棒棒糖上也看起来非常棒。

支持库:

在这里输入图像描述

原生偏好:

在这里输入图像描述

示例项目可以在这里find

错误修正可以作为gradle依赖

下载

现在可以很容易地使用这个库了。 这是最快的方法,但是您应该查阅README了解更多信息。

1.更新你的模块的gradle文件:

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

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

您可以使用PreferenceFragmentCompatPreferenceFragmentCompatDividers

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

3.使用适当的主题

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

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


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

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

例如 :

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

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

看起来像谷歌解决了这个问题。 我已经用首选v14-support版本25.3.1testing过了

1)将compile '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"` 

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

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

通过这种方式,您可以自定义preferenceTheme以便在不影响活动的其他部分的情况下对每个首选项types使用的布局进行样式设置。

我只是在主题中添加了这一行,并在API 19及更高版本上完美工作。

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

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

在API 25中为我工作的解决scheme。我有这个默认的主题:

 <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设备上工作

被接受的“Takisoft Fix”看起来相当笨拙,在玩过之后,我还是不满意。

如果您需要API 9+ PreferenceFragment支持库,我build议使用Material Preference Support Library 。 它完美的作品(至less对我来说)。

将这些代码添加到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.复制新的响应资源文件夹所需的资源,命名为res_fw_v7_preference或其他。

2.使用gradle构build应用程序,并在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:!*~' } ... } 

希望这是有帮助的:)

对我来说最有用的网站: 中等

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

让我知道如果它的作品

只要让它去使用API​​ 11 +。

API 7现在已经快七年了。

Interesting Posts