Je viens de remarquer le fait que la méthode addPreferencesFromResource(int preferencesResId)
est marquée comme obsolète dans la documentation d'Android ( Reference Entry ).
Malheureusement, aucune méthode alternative n'est fournie dans la description de la méthode.
Quelle méthode doit être utilisée à la place afin de connecter un preferenceScreen.xml à la PreferenceActivity correspondante?
addPreferencesFromResource(int preferencesResId)
. Suis-je en train de manquer quelque chose?Réponses:
Aucune méthode alternative n'est fournie dans la description de la méthode car l'approche préférée (à partir de l'API niveau 11) consiste à instancier des objets PreferenceFragment pour charger vos préférences à partir d'un fichier de ressources. Voir l'exemple de code ici: PreferenceActivity
la source
Pour ajouter plus d'informations à la bonne réponse ci-dessus, après avoir lu un exemple d'Android-er, j'ai trouvé que vous pouvez facilement convertir votre activité de préférence en un fragment de préférence. Si vous avez l'activité suivante:
Les seules modifications que vous devez apporter sont de créer une classe de fragment interne, de déplacer le
addPreferencesFromResources()
dans le fragment et d'appeler le fragment de l'activité, comme ceci:Il peut y avoir d'autres subtilités à faire des préférences plus complexes à partir de fragments; si c'est le cas, j'espère que quelqu'un les note ici.
la source
addPreferencesFromResources()
dans le commerce de PreferenceFragment? Cela semble inutile d'un point de vue débutant.@Garret Wilson Merci beaucoup! En tant que noob au codage Android, je suis coincé avec le problème d'incompatibilité des préférences depuis tant d'heures, et je trouve tellement décevant qu'ils aient déconseillé l'utilisation de certaines méthodes / approches pour les nouvelles qui ne sont pas prises en charge par les anciennes API. avoir à recourir à toutes sortes de solutions de contournement pour faire fonctionner votre application dans une large gamme d'appareils. C'est vraiment frustrant!
Votre classe est géniale, car elle vous permet de continuer à travailler dans de nouvelles API avec des préférences comme c'était le cas auparavant, mais elle n'est pas rétrocompatible. Étant donné que j'essaie d'atteindre un large éventail d'appareils, je l'ai légèrement modifié pour le faire fonctionner dans les appareils pré-API 11 ainsi que dans les API plus récentes:
Testé avec succès dans deux émulateurs (2.2 et 4.2).
Pourquoi mon code a l'air si merdique:
Je suis un fan du codage Android et je ne suis pas le plus grand fan de Java.
Afin d'éviter l'avertissement obsolète et de forcer Eclipse à me permettre de compiler, j'ai dû recourir à des annotations, mais celles-ci semblent n'affecter que les classes ou les méthodes, j'ai donc dû déplacer le code sur deux nouvelles méthodes pour en tirer parti.
Je ne voudrais pas avoir à écrire mon identifiant de ressource xml deux fois à chaque fois que je copie et colle la classe pour une nouvelle PreferenceActivity, j'ai donc créé une nouvelle variable pour stocker cette valeur.
J'espère que cela sera utile à quelqu'un d'autre.
PS: Désolé pour mes opinions, mais quand vous venez de découvrir de nouveaux handicaps, vous ne pouvez pas vous empêcher de vous frustrer!
la source
Mon approche est très proche de celle de Garret Wilson (merci, je vous ai voté;)
De plus, il offre une compatibilité descendante avec Android <3.
Je viens de reconnaître que ma solution est encore plus proche de celle de Kevin Remo . C'est juste un tout petit peu plus propre (car il ne repose pas sur l' anti-motif "expection" ).
Pour un exemple "réel" (mais plus complexe), voir NusicPreferencesActivity et NusicPreferencesFragment .
la source
@SuppressLint("NewApi")
- éviter - être plus précis. L'avez-vous exécuté pour des API bas? Il jetteraVerifyError
@SuppressLint("NewApi")
style est tout simplement mauvais@SuppressLint("NewApi")
dans cette situation particulière?@TargetApi(Build.VERSION_CODES.HONEYCOMB)
- pas tous les avertissements pour toute API :)Au lieu d'exceptions, utilisez simplement:
et utilise
pour supprimer les avertissements.
la source
Au lieu d'utiliser un
PreferenceActivity
pour charger directement les préférences, utilisez unAppCompatActivity
ou équivalent qui charge unPreferenceFragmentCompat
qui charge vos préférences. Il fait partie de la bibliothèque de support (maintenant Android Jetpack) et offre une compatibilité avec API 14.Dans votre
build.gradle
, ajoutez une dépendance pour la bibliothèque de prise en charge des préférences:Remarque: nous allons supposer que vos préférences XML sont déjà créées.
Pour votre activité, créez une nouvelle classe d'activités. Si vous utilisez des thèmes matériels, vous devez étendre un
AppCompatActivity
, mais vous pouvez être flexible avec ceci:Maintenant, pour la partie importante: créez un fragment qui charge vos préférences à partir de XML:
Pour plus d'informations, lisez les documents des développeurs Android pour
PreferenceFragmentCompat
.la source