¿Cómo puedo forzar SharedPreferences para guardar?

Por lo que puedo decir, los valores no se almacenan en Android SharedPreferences hasta que se accede a ellos explícitamente. Es decir, si bien pueden tener valores predeterminados en XML, no se coloca ningún valor en un SharedPreferences store hasta que se llame a un método de acceso, razón por la cual todos los accesos tienen parámetros "predeterminados" incluidos.

Si bien esto no es un gran problema simplemente para extraer valores del almacén de preferencias, evita cualquier intento de obtener todas las claves de preferencia que se usan en la aplicación, incluso si están almacenadas en XML. Las teclas no aparecen cuando SharedPreferences#getAll() se llama a menos que ya se haya accedido explícitamente a la preferencia.

¿Hay alguna forma de forzar que todas las preferencias definidas en XML se guarden en un SharedPreferences ¿Tienda? La solución más cercana que puedo encontrar es analizar manualmente los archivos XML de preferencia, encontrar todas las claves y valores predeterminados, y guardar el valor predeterminado para cada uno. ¿Hay un enfoque más limpio?

ACTUALIZACIÓN

Después de analizar esto con más profundidad, obtuve una lista parcial de preferencias por un motivo diferente. Cuando se establecen los valores predeterminados, sólo EditTextPreference y ListPreference los valores se guardan. Los otros dos, una preferencia personalizada y un CheckBoxPreference, son completamente ignorados. He aquí un ejemplo de la CheckBoxPreference eso está siendo ignorado:

<CheckBoxPreference
    android:defaultValue="false"
    android:key="PREF_NAME"
    android:summary="Summary text"
    android:title="Title" />

¿Alguna idea de por qué no se están configurando todos los valores predeterminados?

preguntado el 22 de mayo de 12 a las 19:05

2 Respuestas

Puede usar el PreferenceManager::setDefaultValues. Por ejemplo, en su Application::onCreate método.

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

Si el último argumento es false, esto solo establecerá los valores predeterminados si nunca se ha llamado a este método en el pasado.

contestado el 22 de mayo de 12 a las 20:05

Parece que el problema es un poco más sutil, aunque ciertamente esa es la respuesta correcta al problema que pensé que estaba teniendo. - Derekerdmann

Estoy marcando su respuesta como aceptada ya que respondió a la pregunta que hice, y es probable que eso atraiga más a los usuarios que el problema real que encontré. - Derekerdmann

La razón de las preferencias que faltan en mi caso era en realidad un error de Android. La solución fue establecer manualmente las preferencias que faltaban en sus valores predeterminados, como se indica en una pregunta duplicada: Valor predeterminado de Android CheckBoxPreference

contestado el 23 de mayo de 17 a las 13:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.