@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:
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é 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!