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
Здесь есть ошибка в документации по этому поводу
Intrications

1
Лично я не думаю, что эти решения стоят обходных путей. Попробуйте github.com/kolavar/android-support-v4-preferencefragment
MidasLefko

1
Не могли бы вы отметить stackoverflow.com/a/44236460/238753 как принятый ответ?
Сэм

Ответы:


159

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

Исправление доступно как зависимость 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 В этом разделе вы могли найти подробное решение, которое привело к созданию библиотеки, но я решил удалить его, потому что это могло сбивать с толку. Если вам интересно узнать о шагах, вы все равно можете найти их в истории изменений этого ответа.


6
Размер текста по умолчанию слишком велик, я безуспешно пытался изменить его, используя указанные вами стили. Возможно, вам удалось отрегулировать размер текста?
Tinashe

4
Я пытаюсь поместить туда материальный дизайн, но безуспешно ... Во время процесса я обнаружил, что в пакете предпочтений v7 полностью отсутствуют стиль, макет и другие файлы, связанные с материалами. Между тем, v14 содержит некоторые из них, но проблема с v14 заключается в том, что он расширяет собственный фрагмент, а не вспомогательный. Я думаю, что Google совершил здесь действительно большую ошибку, надеюсь, они исправят ее как можно скорее ...
Гергей Керёсси

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

2
Вы также должны упомянуть, что PreferenceFragmentCompat аварийно завершает работу при повороте в открытом диалоговом окне. code.google.com/p/android/issues/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/issues/detail?id=183376
Intrications

Как сделать так, чтобы тема выглядела материально-дизайном? В настоящее время он показывает мне нативный вид ...
разработчик Android

1
Прочтите мой ответ ниже.
Gergely Kőrössy

35

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

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

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

@JackMeister, вы должны использовать версию v14 только в том случае, если вы нацеливаетесь на уровень API 14 или выше. Несовместимость тем со старыми версиями может быть не единственной проблемой при использовании версии 14 со старыми уровнями API.
Jelmer Brands

@JelmerBrands Конечно: вы не должны использовать библиотеку поддержки v14 в системах с уровнями API ниже 14. Мой комментарий предполагает minSdkVersionот 14 до 20.
Джек Мейстер

Протестировано с 23.4.0, которая также работает. Ключом является использование предпочтения v14, а не предпочтения v7.
user149408

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
Это простейшее рабочее решение, не требующее дополнительных зависимостей. Должен быть принятый ответ ИМХО, теперь, когда большинство приложений имеют минимальный API 14+
Луи CAD

Студия Android не может найти это
Денни

3
добавить com.android.support:preference-v14: в 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

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

Если вам нужна 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.