2011-09-28 10 views
6

Tengo un problema similar como this, por lo que procedió de acuerdo con la solución propuesta y añadió esta línea de código para onCreate:Preferencias Android: valores por defecto incorrectos a pesar de "setDefaultValues"

PreferenceManager.setDefaultValues(this, R.xml.settings, false);

Desafortunadamente el problema todavía se produce, si el usuario no ha alterado la configuración, siendo el valor por defecto (true) de

mPreferences.getBoolean(String.valueOf(day_of_week), true)

se utiliza en lugar de la def ault value del XML.

propuesto para cambiar el parámetro-valor por defecto de getBoolean() para nulo, pero este código se bloquea la aplicación:

mPreferences.getBoolean(String.valueOf(day_of_week), (Boolean) null) 

Algún consejo? ¡Gracias por adelantado!

+0

¿Configura 'android: defaultValue =" default "' en su 'settings.xml'? Y esta línea se debe agregar a su actividad principal 'onCreate', no a su configuración. – Knickedi

+0

No, configuré android: defaultValue en "true" o "false". la función setDefaultValues ​​() se encuentra en la onCreate de mi actividad principal, no en la configuración – JonEasy

+0

@JhonnyR, también desperdicié unas horas rastreando esto también. Estoy de acuerdo, es un error. La gente debería modificar esta publicación para salvar a las personas como yo en el futuro. – Brandyn

Respuesta

5

¡Finalmente funciona! Realmente puse mucho tiempo y esfuerzo en buscar el error y tan pronto como publico aquí, lo descubro solo ~~ gracias chicos por ayudarme con este.

Si alguna vez anyoneelse tiene este problema, la solución va como esto: Cambiar el valor predeterminado de getBoolean() de verdadero a falso, así:

mPreferences.getBoolean(String.valueOf(day_of_week), true) -> no funciona, siempre es cierto, no importa lo que pasó en el XML

mPreferences.getBoolean(String.valueOf(day_of_week), false) -> ¡funciona!Es el valor predeterminado correcto del XML

Realmente no entiendo la lógica para hacer esto, pero ahora funciona perfectamente. A mi me parece un error.

+0

en el futuro, por favor asegúrese de dejar las respuestas como * respuestas * no se edita la pregunta por favor (moví esta para usted, puede ver el historial de edición en la Q para más detalles) –

3

Establezca el tercer argumento de setDefaultValues en true. Así, PreferenceManager.setDefaultValues(this, R.xml.settings, true);

Desde el documentation:

public static void setDefaultValues (Context context, int resId, boolean readAgain)
Si readAgain es falsa, esto sólo será establecer los valores por defecto si este método nunca ha sido llamado en el pasado (o los KEY_HAS_SET_DEFAULT_VALUES en el archivo predeterminado de preferencias compartidas de valor es falso). Para intentar establecer los valores predeterminados de nuevo pasando por alto esta comprobación, establezca readAgain en true.
Nota: esto NO restablecerá las preferencias a sus valores predeterminados.

lo tanto, mi entendimiento es:

  • Si readAgain es false, se lee valores por defecto sólo una vez después de la primera ejecución de la aplicación. Si agrega una propiedad nueva con el valor predeterminado a las preferencias, no se inicializará hasta que desinstale y vuelva a instalar la aplicación.
  • Si readAgain es true, leerá los valores predeterminados de una y otra vez en cada llamada de función. PERO, no restablecerá los valores de a los valores predeterminados, si ya han sido configurados o modificados por la aplicación .
+0

+1 Buen punto, si esta última sugerencia no resuelve el problema, entonces nada :-D – Knickedi

+1

Intenté que ya también ... no hay mejora, aún no son los valores del XML – JonEasy

+0

@JhonnyR ¿Es posible que estos "incorrectos" los valores ya están guardados como valores de configuración actuales? En este caso, este método nunca los reemplazará con los valores predeterminados. De nuevo, según la documentación: si se configura 'readAgain' como' true' NO se restablecerán las preferencias a sus valores predeterminados. Para esa funcionalidad, use 'getDefaultSharedPreferences (Context)' y desactívela seguida de una llamada a este método con este parámetro establecido en 'true'. En el futuro, el borrado no será necesario a medida que comience a inicializar los valores predeterminados correctamente. – GrAnd

Cuestiones relacionadas