PreferenceFragmentCompat вимагає встановити preferenceTheme


114

З новим 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.

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

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

Рідні уподобання:

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


2
Помилка щодо документації для цього тут: code.google.com/p/android/isissue/…
інтригації

1
Особисто я не вважаю, що ці рішення варті обходу. Спробуйте github.com/kolavar/android-support-v4-preferencefragment
MidasLefko

1
Чи можете ви позначити stackoverflow.com/a/44236460/238753 як прийняту відповідь?
Сем

Відповіді:


159

Зразок проекту можна знайти тут

Виправлення виправлень доступне як ступінь залежності

Завантажити

Тепер можна користуватися бібліотекою досить просто. Ось найшвидший спосіб зробити це, але вам слід ознайомитись з ГОТОВОЮ для отримання додаткової інформації.

1. Оновіть файл gradle модуля:

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

2. Використовуйте відповідний клас як основу вашого фрагмента

Ви можете використовувати PreferenceFragmentCompatабо PreferenceFragmentCompatDividers.

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

3. Використовуйте відповідну тему

Встановіть тему, що містить активність, на такий варіант @style/PreferenceFixTheme, як NoActionBar, Light тощо.

Для отримання додаткової інформації та порад щодо використання перейдіть на сторінку проекту .


PS У цьому розділі ви можете знайти детальне рішення, яке призвело до створення бібліотеки, але я вирішив її видалити, оскільки це може заплутати. Якщо вам цікаво кроків, ви все ще можете їх знайти в історії редагування цієї відповіді.


6
Розмір тексту за замовчуванням занадто великий, я намагався його змінити, використовуючи ці стилі, які ви вказали без успіху. Вам, можливо, вдалося відрегулювати розмір тексту?
Тінаше

4
Я намагаюся розмістити там дизайн матеріалу, але не дуже успішно ... Що я виявив під час процесу, це те, що в пакеті налаштувань v7 повністю відсутній стиль тематики, макет та інші файли. Тим часом, v14 містить деякі з них, але проблема з v14 полягає в тому, що він розширює нативний фрагмент, а не підтримуючий. Я думаю, що Google просто зробив тут справді велику помилку, сподіваємось, вони виправлять це
якнайшвидше

1
Я можу спробувати поставити дизайн матеріалу на місце для пристроїв до 21 року, вони виглядають так само, як і оригінали.
Gergely Kőrössy

2
Ви також повинні зазначити, що PreferenceFragmentCompat виходить з ладу при повороті з відкритим діалоговим вікном. code.google.com/p/android/isissue/detail?id=186160
headsvk

21
Це смішно. У мене знадобиться менше часу, щоб зробити фрагмент уподобань з нуля, ніж знайти шлях через усі помилки, обхідні шляхи та тестування, необхідні для того, щоб ця робота була 100% на всіх версіях.
Едвард ван Раак

46

Ви маєте вказати preferenceTheme в темі вашої вподобаної діяльності.

Наприклад :

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

PreferenceThemeOverlay - це тема за замовчуванням, яка постачається з бібліотекою підтримки preference-v7.


14
Це працює, але це виглядає неправильно. Шрифти елементів переваги занадто великі (тестовано на Android 4.1 та 5.1).

@ mus65 У цьому проблема. Я здогадався, що я повинен використовувати цю тему, але це виглядає погано. До оригінального питання я додав більше деталей.
інтригації

3
Я вибрав це як правильну відповідь, тому що це перша, яка сказала правильну тему. Однак бібліотеку підтримки потрібно виправити так, щоб у налаштуваннях використовувався дизайн матеріалу відповідно до code.google.com/p/android/isissue/detail?id=183376
інтрики

Як зробити так, щоб тема виглядала матеріально-дизайнерською? В даний час він показує рідний вигляд для мене ...
андроїд розробник

1
Прочитайте мою відповідь нижче.
Gergely Kőrössy

35

Схоже, 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"

Єдина проблема з цією відповіддю полягає в тому, що фрагмент уподобань використовуватиме тему матеріалу в системах, на яких працює KitKat та нижче. Установка preferenceThemeдля PreferenceThemeOverlay.v14в styles.xmlі PreferenceThemeOverlay.v14.Materialв styles-v21.xmlскрутних проблем.
Джек Майстер

@JackMeister ви повинні використовувати версію v14 лише у тому випадку, якщо ви орієнтуєтесь на рівень api 14 або вище. Не сумісність теми зі старими версіями може бути не єдиною вашою проблемою, коли ви використовуєте v14 зі старими рівнями api.
Бренди Jelmer

@JelmerBrands Впевнений: ви не повинні використовувати бібліотеку підтримки v14 в системах, на яких працює рівень API нижче 14. Мій коментар передбачає minSdkVersionвід 14 до 20.
Джек Майстер

Тестований з 23.4.0, який працює так само добре. Ключове значення має використання v14-переваги, а не v7-переваг.
користувач149408

14

Щоб використовувати PreferenceFragmentCompat, вам потрібно встановити preferenceThemeу своїй темі:

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

Таким чином ви можете налаштувати preferenceThemeстиль для макетів, використовуваних для кожного типу переваг, не впливаючи на інші частини вашої діяльності.


Переконайтеся , що ви додаєте preferenceTheme в правильному стилі , який встановлюється в якості теми для вашої діяльності stackoverflow.com/a/40736138/1572286
Юнесс

14

Я тільки що додав цей рядок у тему, і він ідеально працює на API 19 і вище.

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

3
Це найпростіше, працююче рішення, яке не потребує додаткової залежності. Якщо прийнята відповідь IMHO, тепер, коли більшість додатків є min API 14+
Louis CAD

Android студії цього не можуть знайти
Денні

3
додати com.android.support:preference-v14: to build.gradle
Sofi Software LLC

3

Рішення, яке працювало для мене в 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


2

Додайте цей код до свого 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>


1

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

1

Найкорисніший для мене сайт: Середній

Автор показує, що нам потрібно додати два пакети: com.android.support:preference-v7і com.android.support:preference-v14, тому що перший він поширюється без стилів.

Повідомте мене, чи працює він


0

Прийнятий «Такісофт Фікс» здається досить химерним, і, погравши з ним, я все ще не задоволений отриманим виглядом.

Якщо вам потрібна PreferenceFragmentбібліотека підтримки API 9+ , я рекомендую використовувати Бібліотеку підтримки переваг матеріалів . Це прекрасно працює (принаймні для мене).


0

Проблема виникає через те, що 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:!*~'
    }
    ...
}

Сподіваюся, це корисно :)


0

Дякую @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>

-8

Просто відпустіть його та використовуйте API 11+.

API 7 вже майже сім років.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.