web-dev-qa-db-fra.com

PreferenceFragmentCompat requiert que preferenceTheme soit défini

Avec le nouveau PreferenceFragmentCompat de la bibliothèque de support de v7 Préférence: http://developer.Android.com/tools/support-library/features.html#v7-preference , je reçois 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 devrait être défini?

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

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

comme suggéré par @Bogato mais cela ne semble pas correct et semble très Holo même sur Lollipop.

Bibliothèque de support:

 enter image description here

Préférences natives:

 enter image description here

113
Intrications

LE PROJET EXEMPLE PEUT &ECIRC;TRE TROUV&EACUTE; ICI

Le correctif est disponible en tant que dépendance de niveau

Download

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 de classement 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 PreferenceFragmentCompat ou PreferenceFragmentCompatDividers.

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

3. Utilisez le thème approprié

Définissez le thème de votre activité qui contient une variante de @style/PreferenceFixTheme, telle que NoActionBar, Light, etc.

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


P.S. 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 risquait de prêter à confusion. Si vous êtes intéressé par les étapes, vous pouvez toujours les trouver dans la historique des révisions de cette réponse.

157
Gergely Kőrössy

Vous devez spécifier preferenceTheme 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 preference-v7.

44
Bogato

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

2) Ajoutez PreferenceThemeOverlay.v14.Material au 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 manifeste 

Android:theme="@style/AppTheme.SettingsTheme"
35
Srikar Reddy

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

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

Pour utiliser PreferenceFragmentCompat , vous devez définir preferenceTheme 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 la variable preferenceTheme pour styliser les présentations utilisées pour chaque type de préférence sans affecter les autres parties de votre activité.

13
Gabriele Mariotti

Solution qui a fonctionné pour moi dans 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 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 à l'inclure . Cela fonctionnait sur les appareils Android 4.x et 5.x de mon propre

3
voghDev

Ajoutez ce code à votre fichier 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
Prashant Paliwal

Le site le plus utile pour moi: Moyen

Author montre qu'il faut ajouter deux packages: com.Android.support:preference-v7 et com.Android.support:preference-v14, car le premier est distribué sans styles.

Laissez-moi savoir si cela fonctionne

1
macieg_b

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

Merci @sergio pour la réponse, utiliser <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item> au lieu de <item name="preferenceTheme">@style/Preference</item> me convient parfaitement.

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

Le "Takisoft Fix" accepté semble plutôt compliqué et, après avoir joué avec, je ne suis toujours pas satisfait du résultat.

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

0
shredEngineer

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

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

2.Utilisez gradle pour construire votre application et ajouter des options AAPT supplémentaires dans build.gradle (du module), 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 c'est utile :)

0
Jason