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.

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

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

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

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

Intrications
источник
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.

voghDev
источник
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, поскольку первый распространяется без стилей.

Сообщите мне, если это сработает

macieg_b
источник
0

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

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

shredEngineer
источник
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>
Queendevelopers
источник
-8

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

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

транс
источник