2012-02-16 22 views
62

SharedPreferences tienen getAll método, pero no devolvió las entradas a pesar del hecho existen algunas claves:¿Cómo iterar a través de todas las claves de las preferencias compartidas?

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

retornos verdaderos

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

vuelve mapa vacío

Cuál es el problema? ¿Cómo obtener una lista de todas las preferencias compartidas?

Respuesta

156

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

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

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

Para más puede comprobar PrefUtil.java'sdump() aplicación.

+3

esto está volviendo ningún valor para mí :( – astuter

+3

'getAll() 'puede devolver el valor' NULL'. Sería mejor verificar 'keys' para NULL. – trante

+2

Es mejor usar' 'entry.getValue()' 'en lugar de' 'entry.getValue(). toString()' 'no para get NullPointerException) –

7

Creo que la pregunta tiene más que ver con la razón por

PreferenceManager.getDefaultSharedPreferences(this).getAll() 

está volviendo un mapa vacío/contradictorios que con la forma de iterar sobre un mapa de Java estándar. la android doc no es muy claro acerca de lo que está pasando aquí, pero básicamente parece que la primera llamada vez a

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

- que es lo que se supone que llamar para inicializar las preferencias al iniciar su aplicación - crea algún tipo de versión almacenada en caché de sus preferencias, lo que provoca que los cambios futuros en su archivo de preferencias xml se manejen de manera incoherente, es decir, causando la falta de coincidencia que describió en su pregunta.

para reiniciar esta "entidad caché", siga estos pasos (que se puede ordenar de subir con el enlace de arriba):

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

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

Cuestiones relacionadas