Je dispose d'un programme minimal qui ne fait guère plus que me permettre de définir deux préférences (un int et une chaîne de caractères) en utilisant PreferenceActivity
d'Android. J'ai donc un fichier xml qui définit mes préférences, et une activité qui étend PreferenceActivity
. Mon activité principale dispose d'un menu d'options qui lance mon activité de préférence. Tout cela fonctionne parfaitement. Je peux définir mes préférences et les valeurs sont conservées pendant et après l'exécution de mon programme.
Maintenant, dans mon activité principale, je veux récupérer ces préférences. Ça devrait être facile, non ? Voici le code de chaque exemple que j'ai déjà vu :
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
int intSetting = prefs.getInt("intSetting", 0);
String strSetting = prefs.getString("strSetting", "");
Le problème est que, si je fais une pause à l'appel de getInt()
et que je passe outre, ma pile d'appels ressemble à ceci et l'application va planter si je continue :
Thread [<3> main] (En pause)
ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord, Intent) ligne: 2494
ActivityThread.handleLaunchActivity(ActivityThread$ActivityRecord, Intent) ligne: 2512
ActivityThread.access$2200(ActivityThread, ActivityThread$ActivityRecord, Intent) ligne: 119
ActivityThread$H.handleMessage(Message) ligne: 1863
ActivityThread$H(Handler).dispatchMessage(Message) ligne: 99 Looper.loop() ligne: 123
ActivityThread.main(String[]) ligne: 4363 Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) ligne: non disponible [méthode native] Method.invoke(Object, Object...) ligne: 521
ZygoteInit$MethodAndArgsCaller.run() ligne: 860 ZygoteInit.main(String[]) ligne: 618 NativeStart.main(String[]) ligne: non disponible [méthode native]
J'ai essayé des variations du paramètre passé à getDefaultSharedPreferences(), notamment :
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
...et probablement quelques autres dans différents contextes (c'est-à-dire lors de l'accès aux préférences depuis mon activité principale versus une autre activité versus une fonction dans une classe qui n'est pas une activité. Le résultat est toujours le même.
J'ai lu une douzaine de publications sur le Web de personnes ayant ce problème qui l'ont résolu en écrivant un code identique au mien, alors je ne m'attends pas à une solution, mais si quelqu'un a des idées, faites le moi savoir.