Que faut-il utiliser à la place de «addPreferencesFromResource» dans une PreferenceActivity?

J’ai juste remarqué le fait que la méthode addPreferencesFromResource(int preferencesResId) est marquée comme obsolète dans la documentation d’Android ( Référence Entry ).

Malheureusement, aucune méthode alternative n’est fournie dans la description de la méthode.

Quelle méthode devrait être utilisée à la place pour connecter un preferenceScreen.xml à la PreferenceActivity correspondante?

Aucune autre méthode n’est fournie dans la description de la méthode car l’approche privilégiée (à partir du niveau 11 de l’API) consiste à instancier des objects PreferenceFragment pour charger vos préférences à partir d’un fichier de ressources. Voir l’exemple de code ici: PreferenceActivity

Pour append plus d’informations à la réponse correcte 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:

 public class MyPreferenceActivity extends PreferenceActivity { @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.my_preference_screen); } } 

Les seules modifications que vous devez apporter sont de créer une classe de fragment interne, de déplacer addPreferencesFromResources() dans le fragment et d’appeler le fragment de l’activité, comme ceci:

 public class MyPreferenceActivity extends PreferenceActivity { @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit(); } public static class MyPreferenceFragment extends PreferenceFragment { @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.my_preference_screen); } } } 

Il peut y avoir d’autres subtilités à faire des préférences plus complexes à partir de fragments; Si oui, j’espère que quelqu’un les note ici.

@Garret Wilson Merci beaucoup! Comme un noob pour le codage Android, j’ai été bloqué avec le problème d’incompatibilité des préférences pendant tant d’heures, et je le trouve tellement décevant qu’ils ont déconseillé l’utilisation de certaines méthodes / approches pour les nouveaux qui ne sont pas supportés par les anciennes APIs avoir à recourir à toutes sortes de solutions pour faire fonctionner votre application dans un large éventail de périphériques. 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 avant, mais ce n’est pas rétrocompatible. Comme j’essaie d’atteindre un large éventail de périphériques, je l’ai un peu bricolé pour le faire fonctionner dans les périphériques pré-API 11 ainsi que dans les nouvelles API:

 import android.annotation.TargetApi; import android.os.Bundle; import android.preference.PreferenceActivity; import android.preference.PreferenceFragment; public class MyPrefsActivity extends PreferenceActivity { private static int prefs=R.xml.myprefs; @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { getClass().getMethod("getFragmentManager"); AddResourceApi11AndGreater(); } catch (NoSuchMethodException e) { //Api < 11 AddResourceApiLessThan11(); } } @SuppressWarnings("deprecation") protected void AddResourceApiLessThan11() { addPreferencesFromResource(prefs); } @TargetApi(11) protected void AddResourceApi11AndGreater() { getFragmentManager().beginTransaction().replace(android.R.id.content, new PF()).commit(); } @TargetApi(11) public static class PF extends PreferenceFragment { @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(MyPrefsActivity.prefs); //outer class // private members seem to be visible for inner class, and // making it static made things so much easier } } } 

Testé dans deux émulateurs (2.2 et 4.2) avec succès.

Pourquoi mon code a l'air si nul:

Je suis un noob pour le 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 comstackr, j'ai dû recourir à des annotations, mais celles-ci ne semblent affecter que les classes ou les méthodes. J'ai donc dû déplacer le code sur deux nouvelles méthodes.

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, alors j'ai 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 déformées, mais quand vous venez de découvrir de tels handicaps, vous ne pouvez pas vous empêcher mais être frustré!

Mon approche est très proche de celle de Garret Wilson (merci, je vous ai voté;)

En outre, 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 peu plus propre (car il ne s’appuie pas sur l’ antipatinage “expection” ).

 public class MyPreferenceActivity extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { onCreatePreferenceActivity(); } else { onCreatePreferenceFragment(); } } /** * Wraps legacy {@link #onCreate(Bundle)} code for Android < 3 (ie API lvl * < 11). */ @SuppressWarnings("deprecation") private void onCreatePreferenceActivity() { addPreferencesFromResource(R.xml.preferences); } /** * Wraps {@link #onCreate(Bundle)} code for Android >= 3 (ie API lvl >= * 11). */ @TargetApi(Build.VERSION_CODES.HONEYCOMB) private void onCreatePreferenceFragment() { getFragmentManager().beginTransaction() .replace(android.R.id.content, new MyPreferenceFragment ()) .commit(); } } 

Pour un exemple “réel” (mais plus complexe), voir NusicPreferencesActivity et NusicPreferencesFragment .

Au lieu d’exceptions, utilisez simplement:

 if (Build.VERSION.SDK_INT >= 11) 

et utilise

 @SuppressLint("NewApi") 

pour supprimer les avertissements.

Au lieu d’utiliser PreferenceActivity pour charger directement les préférences, utilisez un AppCompatActivity ou un équivalent qui charge un PreferenceFragmentCompat qui charge vos préférences. Cela fait partie de la bibliothèque de support (maintenant Android Jetpack) et assure la compatibilité avec l’API 14.

Dans votre build.gradle , ajoutez une dépendance pour la bibliothèque de prise en charge des préférences:

 dependencies { // ... implementation "androidx.preference:preference:1.0.0-alpha1" } 

Note: Nous allons supposer que vos préférences XML sont déjà créées.

Pour votre activité, créez une nouvelle classe d’activité. Si vous utilisez des thèmes matériels, vous devez étendre une AppCompatActivity , mais vous pouvez être flexible avec ceci:

 public class MyPreferencesActivity extends AppCompatActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.my_preferences_activity) if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .replace(R.id.fragment_container, MyPreferencesFragment()) .commitNow() } } } 

Maintenant, pour la partie importante: créer un fragment qui charge vos préférences à partir de XML:

 public class MyPreferencesFragment extends PreferenceFragmentCompat { @Override public void onCreatePreferences(Bundle savedInstanceState, Ssortingng rootKey) { setPreferencesFromResource(R.xml.my_preferences_fragment); // Your preferences fragment } } 

Pour plus d’informations, lisez les documents relatifs aux développeurs Android pour PreferenceFragmentCompat .