Non può preferenze di accesso creato da PreferenceActivity
-
29-09-2019 - |
Domanda
Ho un programma minimo che non fa altro che mi permetta di impostare due preferenze (un int e una stringa) utilizzando PreferenceActivity
di Android. Così ho un file XML che definisce le mie preferenze, e un'attività che si estende PreferenceActivity
. La mia attività principale ha un menu di opzioni che lancia mia attività preferenza. Tutto questo funziona alla grande. Posso impostare le mie preferenze ei valori vengono mantenuti durante e dopo i miei esegue programma.
Ora, nella mia attività principale che voglio recuperare tali preferenze. Dovrebbe essere facile, giusto? Ecco il codice da ogni campione che abbia mai visto:
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
int intSetting = prefs.getInt("intSetting", 0);
String strSetting = prefs.getString("strSetting", "");
Il problema è che, se rompo alla chiamata getInt()
e scavalcare, il mio aspetto dello stack di questo tipo e l'applicazione sarà in crash se continuo:
Discussione [<3> principale] (sospeso)
ActivityThread.performLaunchActivity (ActivityThread $ ActivityRecord, Intent) Linea: 2494
ActivityThread.handleLaunchActivity (ActivityThread $ ActivityRecord, Intent) Linea: 2512
ActivityThread.access $ 2200 (ActivityThread, ActivityThread $ ActivityRecord, Intent) line: 119
ActivityThread $ H.handleMessage (Messaggio) Linea: 1863
ActivityThread $ H (Handler) .dispatchMessage (Messaggio) line: 99 Looper.loop) Linea (: 123
ActivityThread.main (String []) Linea: 4363 Method.invokeNative (Object, Object [], Class, Class [], Classe, int, booleano) Linea: non disponibile [native Metodo] Method.invoke (oggetto, L'oggetto ...) la linea: 521
ZygoteInit $ MethodAndArgsCaller.run () line: 860 ZygoteInit.main (String []) line: 618 NativeStart.main (String []) Linea: non disponibile [metodo nativo]
Ho provato variazioni sul parametro passato a getDefaultSharedPreferences (), tra cui:
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
... e probabilmente alcuni altri in contesto diverso (ad esempio quando si accede preferenze dalla mia attività principale contro un'altra attività contro una qualche funzione in una classe che non è un'attività. Il risultato è sempre lo stesso.
Ho letto una dozzina di domande e risposte messaggi su web da altri con questo problema che hanno risolto scrivendo il codice identico al mio, quindi non mi aspetto che ci sia una soluzione, ma se qualcuno ha qualche idea, fatemelo sapere.
Soluzione
non mostrano l'analisi dello stack. L'Thread [<3> main] (Suspended)
viene emesso inutile da Eclipse. È necessario esaminare la traccia vera stack, che si dovrebbe ottenere consentendo Android per passare alla finestra di dialogo "Forza Chiudi", poi guardando LogCat (nel vostro punto di vista DDMS) per l'analisi dello stack.
La mia ipotesi è che avete una preferenza chiamato intSetting
ma non è un numero intero, ma che è solo una supposizione. A braccio, non riesco a pensare a una qualsiasi delle classi incorporate Preference
che memorizzerà una preferenza intero, in quanto la maggior parte memorizzare le stringhe.
Il tuo modo di accedere al SharedPreferences
di default (usando this
) è corretto e non dovrebbe avere bisogno di essere cambiato.
Ecco un progetto di esempio che mostra l'utilizzo di PreferenceActivity
e ottenere la parte posteriore SharedPreferences
.
Altri suggerimenti
Solo per assicurarsi che:
-
In ti
AndroidManifest
si dovrebbe avere laActivity
che si estendePreferenceActivity
con qualcosa di simile: -
Il
Activity
che si estendePreferenceActivity
dovrebbe avere il seguente codice:@Override protetta onCreate void (Bundle savedInstanceState) { super.onCreate (savedInstanceState); addPreferencesFromResource (R.layout.prefs); }
dove R.layout.prefs
è xml le preferenze.
Se avete fatto entrambe le cose, si prega di modificare la tua domanda con l'XML che si sta utilizzando in modo ppl in grado di riprodurre il problema.
Non potrebbe andare in crash, anche se la preferenza non è stata salvata, penso che vi siete persi un po 'di codice e l'incidente non viene da questo punto. Avete qualche altro thread?