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.使用适当的类作为片段的基础
您可以使用PreferenceFragmentCompat
或PreferenceFragmentCompatDividers
。
( 在导入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-v7
: com.android.support:preference-v7
和com.android.support:preference-v14
,因为第一个包没有样式分布。
让我知道如果它的作品
只要让它去使用API 11 +。
API 7现在已经快七年了。