PreferenceFragmentCompat требует, чтобы preferenceTheme был установлен
С новым PreferenceFragmentCompat из библиотеки поддержки предпочтений v7: 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.
Библиотека поддержки:
![введите описание изображения здесь]()
Собственные предпочтения:
![введите описание изображения здесь]()
Ответы
Ответ 1
Примерный проект можно найти здесь
Исправление ошибок доступно как gradle зависимость
![Download]()
Теперь можно использовать библиотеку довольно легко. Вот самый быстрый способ сделать это, но вы должны проверить README для получения дополнительной информации.
1. Обновите свой модуль gradle файл:
compile 'com.takisoft.fix:preference-v7:27.0.0.0'
2. Используйте соответствующий класс в качестве базы фрагментов
Вы можете использовать либо PreferenceFragmentCompat
, либо PreferenceFragmentCompatDividers
.
(При импорте PreferenceFragmentCompat
!) следите за именем соответствующего пакета
3. Используйте соответствующую тему
Установите свою тему активности в вариант @style/PreferenceFixTheme
, например NoActionBar, Light и т.д.
Дополнительные сведения и советы по использованию см. на странице .
P.S. В этом разделе вы можете найти подробное решение, которое привело к созданию библиотеки, но я решил удалить ее, потому что это может сбивать с толку. Если вам интересны этапы, вы можете найти их в истории изменений этого ответа.
Ответ 2
Вы должны указать preferenceTheme в своей теме активности предпочтений.
Например:
<style name="SettingsTheme" parent="Theme.AppCompat.NoActionBar">
<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>
PreferenceThemeOverlay - это тема по умолчанию, которая поставляется с библиотекой поддержки preference-v7.
Ответ 3
Похоже, Google исправил эту проблему. Я протестировал это с предпочтением v14-support version 25.3.1
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) Наконец, добавьте стиль в манифест
`android:theme="@style/AppTheme.SettingsTheme"`
Ответ 4
Чтобы использовать PreferenceFragmentCompat, вы должны установить preferenceTheme
в своей теме:
<style name="AppTheme" parent="@style/Theme.AppCompat.Light">
...
<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>
Таким образом вы можете настроить preferenceTheme
для стилей макетов, используемых для каждого типа предпочтений, без влияния на другие части вашей деятельности.
Ответ 5
Я просто добавил эту строку в тему, и она отлично работает на API 19 и выше.
<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
Ответ 6
Я добавил элемент "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>
Ответ 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
Принятое "Takisoft Fix" кажется довольно глупым и после игры с ним, я все еще не удовлетворен результатом.
Если вам нужна библиотека поддержки API 9+ PreferenceFragment
, я рекомендую использовать Библиотека поддержки материалов.
Он отлично работает (по крайней мере для меня).
Ответ 9
Добавьте этот код в свои 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>
Ответ 10
Проблема возникает из-за того, что AAPT (инструмент для установки средств для Android не может найти ресурсы). Исправить эту проблему следующим образом:
1. Копируйте ресурсы, которые необходимы для новой папки ресурсов ответа, названной как res_fw_v7_preference или что-то еще.
2.Using gradle для создания вашего приложения и добавления дополнительных опций AAPT в build.gradle(module's) следующим образом:
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:!*~'
}
...
}
Надеюсь, что это будет полезно:)
Ответ 11
Самый полезный сайт для меня: Medium
Автор показывает, что нам нужно добавить два пакета: com.android.support:preference-v7
и com.android.support:preference-v14
, потому что первый он распространяется без стилей.
Сообщите мне, если он работает
Ответ 12
Просто отпустите его и используйте API 11+.
API 7 сейчас почти семь лет.