PreferenceFragmentCompat требует установки preferenceTheme

С новым PreferenceFragmentCompat из библиотеки поддержки настроек v7: http://developer.android.com/tools/support-library/features.html, я получаю эту ошибку

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.

Библиотека поддержки:

введите описание изображения здесь

Родные предпочтения:

введите описание изображения здесь

13 ответов

Решение

Пример проекта можно найти здесь

Исправление доступно как зависимость gradle

https://bintray.com/gericop/maven/com.takisoft.fix%3Apreference-v7/_latestVersion

Теперь библиотеку можно использовать довольно просто. Вот самый быстрый способ сделать это, но вы должны проверить README для получения дополнительной информации.

1. Обновите файл Gradle вашего модуля:

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

2. Используйте соответствующий класс в качестве основы вашего фрагмента

Вы можете использовать либо PreferenceFragmentCompat или же PreferenceFragmentCompatDividers,

(Следите за соответствующим именем пакета при импорте PreferenceFragmentCompat !)

3. Используйте соответствующую тему

Установите тему, в которой вы работаете, на вариант @style/PreferenceFixTheme как NoActionBar, Light и т. д.

Для получения дополнительной информации и советов по использованию, перейдите на страницу проекта.


PS В этом разделе вы можете найти подробное решение, которое привело к созданию библиотеки, но я решил удалить ее, потому что это может сбить с толку. Если вам интересно узнать о шагах, вы все равно можете найти их в истории изменений этого ответа.

Вы должны указать preferenceTheme в теме ваших предпочтений.

Например:

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

PreferenceThemeOverlay - это тема по умолчанию, которая поставляется с библиотекой поддержки preference-v7.

Похоже, Google исправил эту проблему. Я проверил это с предпочтением v14-поддержка версии 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) Наконец, добавьте стиль в манифест

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

Я только добавил эту строку в тему, и она отлично работает на API 19 и выше.

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

Чтобы использовать PreferenceFragmentCompat, вы должны установить preferenceTheme в вашей теме:

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

Таким образом, вы можете настроить preferenceTheme стиль макетов, используемых для каждого типа предпочтений, не затрагивая другие части вашей деятельности.

Добавьте этот код в ваш файл 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>

Решение, которое работало для меня в 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 моего

Самый полезный сайт для меня: Средний

Автор показывает, что нам нужно добавить два пакета: com.android.support:preference-v7 а также com.android.support:preference-v14потому что первый раздаётся без стилей.

Дайте мне знать, если это работает

Я добавил элемент "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>

Принятый "Takisoft Fix" кажется довольно грязным, и, поиграв с ним, я все еще не удовлетворен полученным результатом.

Если вам нужен API 9+ PreferenceFragment поддержка библиотеки, я рекомендую использовать библиотеку поддержки предпочтений материалов. Работает отлично (по крайней мере для меня).

Спасибо @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>

Проблема возникает из-за того, что AAPT(Android Asset Packaging Tool) не может найти некоторые ресурсы. Исправьте эту проблему следующим образом:

1. Скопируйте ресурсы, которые необходимы в новую отвечающую папку ресурсов, названную как res_fw_v7_preference или что-то еще.

2. С помощью gradle создайте свое приложение и добавьте несколько дополнительных параметров AAPT в build.gradle(модуль), например:

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

Надеюсь, что это полезно:)

Просто отпустите и используйте API 11+.

API 7 уже почти семь лет.