No se puede preferencias de acceso creado por PreferenceActivity
-
29-09-2019 - |
Pregunta
Tengo un programa mínimo que no hace más que permítanme establecer dos preferencias (un entero y una cadena) usando PreferenceActivity
de Android. Así que tengo un archivo XML que define mis preferencias, y una actividad que se extiende PreferenceActivity
. Mi actividad principal tiene un menú de opciones que pone en marcha mi actividad preferencia. Todo esto funciona muy bien. Puedo configurar mis preferencias y los valores son retenidos durante y después de mis ejecuta el programa.
Ahora, en mi actividad Quiero recuperar esas preferencias. Debe ser fácil, ¿verdad? Aquí está el código de todas las muestras que he visto:
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
int intSetting = prefs.getInt("intSetting", 0);
String strSetting = prefs.getString("strSetting", "");
El problema es que si rompo en la llamada getInt()
y pasar por encima, mi aspecto pila como este y la aplicación se bloqueará si continúo:
Tema [<3> principal] (suspendida)
ActivityThread.performLaunchActivity (ActivityThread $ ActivityRecord, Intención) Línea: 2494
ActivityThread.handleLaunchActivity (ActivityThread $ ActivityRecord, Intención) Línea: 2512
ActivityThread.access $ 2200 (ActivityThread, ActivityThread $ ActivityRecord, Intención) línea: 119
ActivityThread $ H.handleMessage (Mensaje) línea: 1863
ActivityThread $ H (Handler) .dispatchMessage (Mensaje) línea: 99 Looper.loop línea (): 123
ActivityThread.main (String []) line: 4363 Method.invokeNative (Object, Object [], Clase, Clase [], Clase, int, booleano) la línea: no disponible [nativa método Method.invoke] (Object, Objeto ...) Línea: 521
ZygoteInit $ MethodAndArgsCaller.run () línea: 860 ZygoteInit.main (String []) línea: 618 NativeStart.main (String []) línea: no disponible [método nativo]
he intentado variaciones sobre el parámetro pasado a getDefaultSharedPreferences (), incluyendo:
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
... y probablemente algunos otros en un contexto diferente (es decir, cuando se accede a las preferencias de mi actividad frente a otra actividad frente a alguna función en una clase que no es una actividad. El resultado es siempre el mismo.
He leído una docena de preguntas y respuestas mensajes en la Web de otras personas con este problema que han resuelto mediante la escritura de código idéntica a la mía, así que no espero que hay una solución, pero si alguien tiene alguna idea, que me haga saber.
Solución
No mostrar el seguimiento de la pila. El Thread [<3> main] (Suspended)
se emite inútil desde Eclipse. Es necesario examinar el seguimiento de pila real, lo que usted debe conseguir al permitir Android para continuar el diálogo "Fuerza de Cierre", a continuación, mirando LogCat (en su perspectiva DDMS) para el seguimiento de la pila.
Mi conjetura es que usted tiene una preferencia intSetting
llamado, pero no es un entero, pero eso es sólo una conjetura. Fruto de la casualidad, no puedo pensar en ninguna de las clases incorporadas Preference
que almacenarán una preferencia número entero, ya que la mayoría de almacenar cadenas.
Su forma de acceder a la SharedPreferences
defecto (usando this
) es correcta y no debería ser necesario cambiar.
Aquí es una proyecto de ejemplo que muestra el uso de PreferenceActivity
y conseguir la parte posterior SharedPreferences
.
Otros consejos
Sólo para asegurarse de:
-
En
AndroidManifest
que usted debe tener laActivity
que se extiendePreferenceActivity
con algo como esto: -
El
Activity
que se extiendePreferenceActivity
debería tener el siguiente código:@ Override protegida onCreate void (Bundle savedInstanceState) { super.onCreate (savedInstanceState); addPreferencesFromResource (R.layout.prefs); }
donde R.layout.prefs
es xml sus preferencias.
Si usted ha hecho ambas cosas, por favor editar su pregunta con el xml que está usando para PPL pueden reproducir su problema.
No se estrellaría, incluso si sus preferencias no se ha guardado, creo que se ha perdido algo de código y el accidente no viene de este punto. ¿Tiene algunos otros hilos?