¿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?

Eugene Chumak
fuente

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()

Lalit Poptani
fuente
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);
rmanna
fuente
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()             
 }
anoo_radha
fuente