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:
Préférences natives:
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.
compile 'com.takisoft.fix:preference-v7:27.0.0.0'
Vous pouvez utiliser PreferenceFragmentCompat
ou PreferenceFragmentCompatDividers
.
(Faites attention au nom du paquet approprié lors de l'importation PreferenceFragmentCompat
!)
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.
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.
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"
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>
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é.
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
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>
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
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>
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>
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).
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 :)