PreferenceFragmentCompat nécessite une préférenceThème à définir


114

Avec le nouveau PreferenceFragmentCompat de la bibliothèque de prise en charge des préférences v7: http://developer.android.com/tools/support-library/features.html#v7-preference , j'obtiens cette erreur

E  java.lang.IllegalStateException: Must specify preferenceTheme in theme
E      at android.support.v7.preference.PreferenceFragmentCompat.onCreate(PreferenceFragmentCompat.java:202)

Quel thème doit être défini?

Mise à jour: j'ai essayé d'utiliser

<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>

comme suggéré par @Bogato mais cela n'a pas l'air correct et semble très Holo même sur Lollipop.

Bibliothèque de support:

entrez la description de l'image ici

Préférences natives:

entrez la description de l'image ici


2
Il y a un bug concernant la documentation à ce sujet ici: code.google.com/p/android/issues
Intrications

1
Personnellement, je ne pense pas que ces solutions valent les solutions de contournement. Essayez github.com/kolavar/android-support-v4-preferencefragment
MidasLefko

1
Pouvez-vous indiquer stackoverflow.com/a/44236460/238753 comme réponse acceptée?
Sam

Réponses:


159

L'exemple de projet peut être trouvé ici

Le correctif est disponible en tant que dépendance gradle

Télécharger

Maintenant, on peut utiliser la bibliothèque assez facilement. Voici le moyen le plus rapide de le faire, mais vous devriez consulter le README pour plus d'informations.

1. Mettez à jour le fichier gradle de votre module:

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

2. Utilisez la classe appropriée comme base de votre fragment

Vous pouvez utiliser soit PreferenceFragmentCompatou PreferenceFragmentCompatDividers.

( Faites attention au nom du package approprié lors de l'importation PreferenceFragmentCompat! )

3. Utilisez le thème approprié

Définissez le thème de votre activité @style/PreferenceFixThemeconteneur sur une variante de , comme NoActionBar, Light, etc.

Pour plus d'informations et de conseils d'utilisation, accédez à la page du projet .


PS Dans cette section, vous pouvez trouver la solution détaillée qui a conduit à la création de la bibliothèque, mais j'ai décidé de la supprimer car elle pourrait prêter à confusion. Si vous êtes curieux de connaître les étapes, vous pouvez toujours les trouver dans l' historique des révisions de cette réponse.


6
La taille du texte par défaut est trop grande, j'ai essayé de la modifier en utilisant les styles que vous avez indiqués sans succès. Avez-vous peut-être réussi à ajuster la taille du texte?
Tinashe

4
J'essaie de mettre la conception matérielle là-dedans, mais pas vraiment de succès ... Ce que j'ai découvert pendant le processus, c'est que le pack de préférences v7 manque complètement le style, la mise en page et d'autres fichiers sur le thème du matériau. Pendant ce temps, la v14 en contient certains, mais le problème avec la v14 est qu'elle étend le fragment natif, pas celui de support. Je pense que Google vient de faire une très grosse erreur ici, j'espère qu'ils la répareront dès que possible ...
Gergely Kőrössy

1
Je pourrais essayer de mettre en place la conception des matériaux pour les appareils pré-21, ils ont maintenant la même apparence que l'original.
Gergely Kőrössy

2
Vous devez également mentionner que PreferenceFragmentCompat se bloque s'il est pivoté avec une boîte de dialogue ouverte. code.google.com/p/android/issues/detail?id=186160
headsvk

21
C'est ridicule. Il me faudrait moins de temps pour créer un fragment de préférence à partir de zéro que pour trouver un moyen de résoudre tous les bogues, solutions de contournement et tests nécessaires pour que cela fonctionne à 100% sur toutes les versions.
Edward van Raak le

46

Vous devez spécifier le thème de préférence dans le thème de votre activité de préférence.

Par exemple :

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

PreferenceThemeOverlay est le thème par défaut fourni avec la bibliothèque de support de préférence-v7.


14
Cela fonctionne, mais cela semble faux. Les polices des éléments de préférence sont trop grandes (testées sur Android 4.1 et 5.1).

@ mus65 C'est le problème. J'avais deviné que je devrais utiliser ce thème, mais il semble mauvais. J'ai ajouté plus de détails à la question initiale.
Intrications

3
J'ai choisi cela comme la bonne réponse car c'était la première à indiquer le bon thème à définir. Cependant, la bibliothèque de support doit être corrigée afin que les préférences utilisent la conception matérielle selon code.google.com/p/android/issues/detail?id=183376
Intrications

Comment donner au thème un aspect Material-Design? Actuellement, il montre le look natif pour moi ...
Développeur Android

1
Lisez ma réponse ci-dessous.
Gergely Kőrössy

35

On dirait que Google a résolu ce problème. J'ai testé cela avec la préférence v14-support version 25.3.1

1) Ajoutez implementation 'com.android.support:preference-v14:25.3.1'à votre Gradle.

2) Ajoutez PreferenceThemeOverlay.v14.Materialau style au lieu de PreferenceThemeOverlay.

<style name="AppTheme.SettingsTheme" parent="AppTheme.NoActionBar">
    <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
</style>

3) Enfin, ajoutez le style au Manifest

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

Le seul problème avec cette réponse est que le fragment de préférence utilisera le thème matériel sur les systèmes exécutant KitKat et les versions antérieures. Le réglage preferenceThemesur PreferenceThemeOverlay.v14in styles.xmlet sur PreferenceThemeOverlay.v14.Materialin styles-v21.xmlrésout le problème.
Jack Meister

@JackMeister, vous ne devez utiliser la version v14 que si vous ciblez le niveau d'API 14 ou supérieur. L'incompatibilité des thèmes avec les anciennes versions peut ne pas être votre seul problème lorsque vous utilisez la v14 avec des niveaux d'API plus anciens.
Jelmer Brands

@JelmerBrands Bien sûr: vous ne devriez pas utiliser une bibliothèque de support v14 sur des systèmes exécutant des niveaux d'API inférieurs à 14. Mon commentaire suppose une minSdkVersionentre 14 et 20.
Jack Meister

Testé avec 23.4.0, qui fonctionne aussi bien. Utiliser la préférence v14, et non la préférence v7, est la clé.
user149408

14

Pour utiliser le PreferenceFragmentCompat, vous devez définirpreferenceTheme dans votre thème:

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

De cette manière, vous pouvez personnaliser le preferenceThemestyle des dispositions utilisées pour chaque type de préférence sans affecter les autres parties de votre activité.


Assurez-vous que vous ajoutez le thème de préférence au bon style qui est défini comme thème pour votre activité stackoverflow.com/a/40736138/1572286
Youness

14

Je viens d'ajouter cette ligne dans le thème et cela fonctionne parfaitement sur l'API 19 et plus.

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

3
Il s'agit de la solution la plus simple et fonctionnelle, qui ne nécessite aucune dépendance supplémentaire. Devrait être la réponse acceptée à mon humble avis, maintenant que la plupart des applications sont au minimum API 14+
Louis CAD

Le studio Android ne peut pas trouver cela
Denny

3
ajouter com.android.support:preference-v14: to build.gradle
Sofi Software LLC

3

Solution qui a fonctionné pour moi dans l'API 25. J'avais ce thème par défaut:

<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>

Et y a ajouté cette ligne

<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 était déjà défini, je n'avais pas besoin de l'inclure. Cela a fonctionné sur mes propres appareils Android 4.x et 5.x


2

Ajoutez ce code à votre styles.xml et modifiez-le en conséquence. Cela devrait fonctionner correctement.

<!-- 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

J'ai ajouté l'élément "preferenceTheme" dans mon style et cela a semblé résoudre le problème:

   <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

Le site le plus utile pour moi: Moyen

L'auteur montre que nous devons ajouter deux packages: com.android.support:preference-v7et com.android.support:preference-v14, parce que le premier est distribué sans styles.

Dites moi si ca marche


0

Le "Takisoft Fix" accepté semble plutôt kludgy et après avoir joué avec, je ne suis toujours pas satisfait du look qui en résulte.

Si vous avez besoin de la PreferenceFragmentbibliothèque de support API 9+ , je vous recommande d'utiliser la bibliothèque de support de préférence de matériau . Cela fonctionne parfaitement (du moins pour moi).


0

Le problème se produit car l'AAPT (Android Asset Packaging Tool) ne peut pas trouver certaines ressources. Résolvez ce problème comme suit:

1. Copiez les ressources nécessaires dans un nouveau dossier de ressources répondant, nommé comme res_fw_v7_preference ou autre chose.

Utilisez gradle pour créer votre application et ajoutez des options AAPT supplémentaires dans build.gradle (modules) comme ceci:

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

J'espère que cela vous sera utile :)


0

Merci @sergio pour la réponse, utiliser <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>au lieu de <item name="preferenceTheme">@style/Preference</item>fonctionne très bien pour moi.

<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

Laissez-le aller et utilisez l'API 11+.

API 7 a presque sept ans maintenant.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.