3 votes

Impossible d'accéder aux préférences créées par PreferenceActivity

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.

8voto

CommonsWare Points 402670

Vous ne montrez pas la trace de la pile. Le Thread [<3> main] (Suspended) est une sortie inutile d'Eclipse. Vous devez examiner la vraie trace de la pile, que vous devriez obtenir en laissant Android continuer jusqu'au dialogue "Force Close", puis en regardant LogCat (dans votre perspective DDMS) pour la trace de la pile.

Je suppose que vous avez une préférence nommée intSetting mais ce n'est pas un entier, mais ce n'est qu'une supposition. En improvisant, je ne peux pas penser à l'une des classes Preference intégrées qui stockeront une préférence entière, car elles stockent principalement des chaînes.

Votre façon d'accéder aux SharedPreferences par défaut (en utilisant this) est correcte et ne devrait pas avoir besoin d'être modifiée.

Voici un projet d'exemple montrant l'utilisation de PreferenceActivity et la récupération des SharedPreferences.

0voto

Macarse Points 36519

Juste pour être sûr :

  • Dans votre AndroidManifest, vous devriez avoir l'Activity qui étend PreferenceActivity avec quelque chose comme ceci :

    < activity android:name=".activities.Preferences" android:label="@string/app_name"/>

  • L'Activity qui étend PreferenceActivity devrait avoir le code suivant :

    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.layout.prefs); }

R.layout.prefs est votre fichier xml de préférences.

Si vous avez fait les deux choses, veuillez modifier votre question avec le xml que vous utilisez afin que les personnes puissent reproduire votre problème.

0voto

fedj Points 1949

Il ne planterait pas, même si vos préférences n'étaient pas enregistrées, je pense que vous avez manqué une partie du code et le crash ne vient pas de ce point. Avez-vous d'autres threads ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X