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 сейчас почти семь лет.