¿Cómo recorrer todas las claves de preferencias compartidas?


79

SharedPreferences tiene el método getAll, pero no devuelve ninguna entrada a pesar de que existen algunas claves:

PreferenceManager.getDefaultSharedPreferences(this).contains("addNewAddress");

devuelve verdadero

Map<String, ?> keys=PreferenceManager.getDefaultSharedPreferences(this).getAll();

devuelve mapa vacío

¿Qué está mal? ¿Cómo obtener una lista de todas las preferencias compartidas?

Respuestas:


177

Lo que puede hacer es usar el getAll()método de SharedPreferencesy obtener todos los valores Map<String,?>y luego puede iterar fácilmente.

Map<String,?> keys = prefs.getAll();

for(Map.Entry<String,?> entry : keys.entrySet()){
            Log.d("map values",entry.getKey() + ": " + 
                                   entry.getValue().toString());            
 }

Para obtener más información, puede consultar la implementación.PrefUtil.java's dump()


3
esto no devuelve ningún valor para mí :(
uniruddh

3
getAll()puede devolver NULLvalor. Sería mejor buscar keysNULL.
trante

3
Es mejor usarlo entry.getValue()que entry.getValue().toString()no obtener NullPointerException)
Vlad

8

creo que la pregunta tiene más que ver con por qué

    PreferenceManager.getDefaultSharedPreferences(this).getAll()

devuelve un mapa vacío / contradictorio que con cómo iterar sobre un mapa estándar de Java. el documento de Android no es muy claro sobre lo que está sucediendo aquí, pero básicamente parece ser la primera llamada a

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

- que es lo que se supone que debe llamar para inicializar las preferencias cuando inicia su aplicación - crea algún tipo de versión en caché de sus preferencias que hace que los cambios futuros en su archivo de preferencias xml se manejen de manera inconsistente, es decir, causando la falta de coincidencia descrito en su pregunta.

para restablecer esta "entidad almacenada en caché", siga estos pasos (que puede encontrar en el enlace anterior):

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    prefs.edit().clear();
    PreferenceManager.setDefaultValues(this, R.xml.preferences, true);

la solución que necesitaba era una combinación de esta respuesta y stackoverflow.com/a/9310697/1815624
CrandellWS

4

en caso de que alguien quiera iterar a través de preferencias compartidas en KOTLIN

 sharedPreferences?.all?.forEach {
     //access key using it.key & value using it.value
     Log.d("Preferences values",it.key() + ": " + it.value()             
 }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.