Wie kann ich alle Schlüssel gemeinsamer Einstellungen durchlaufen?

79

SharedPreferences haben die Methode getAll, geben jedoch keine Einträge zurück, obwohl einige Schlüssel vorhanden sind:

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

gibt true zurück

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

Gibt eine leere Karte zurück

Was ist falsch? Wie erhalte ich eine Liste aller freigegebenen Einstellungen?

Eugene Chumak
quelle

Antworten:

177

Was Sie tun können, ist die getAll()Methode von SharedPreferencesund alle Werte in zu bekommen Map<String,?>und dann können Sie leicht durchlaufen.

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

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

Weitere Informationen finden Sie in der Implementierung.PrefUtil.java's dump()

Lalit Poptani
quelle
3
Dies gibt keine Werte für mich zurück :(
uniruddh
3
getAll()kann NULLWert zurückgeben. Es wäre besser, keysnach NULL zu suchen.
Trante
3
Es ist besser zu verwenden, entry.getValue()als entry.getValue().toString()nicht NullPointerException zu bekommen)
Vlad
8

Ich denke, die Frage hat mehr damit zu tun, warum

    PreferenceManager.getDefaultSharedPreferences(this).getAll()

gibt eine leere / widersprüchliche Karte zurück, als wenn über eine Standard-Java-Karte iteriert wird. Das Android-Dokument ist nicht wirklich klar, was hier vor sich geht, aber im Grunde scheint es der erste Anruf überhaupt zu sein

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

- Dies ist das, was Sie aufrufen sollten, um die Einstellungen beim Starten Ihrer App zu initialisieren. - Erstellt eine zwischengespeicherte Version Ihrer Einstellungen, die dazu führt, dass zukünftige Änderungen an Ihrer XML-Einstellungsdatei inkonsistent behandelt werden, dh dass Sie nicht übereinstimmen in Ihrer Frage beschrieben.

Führen Sie die folgenden Schritte aus, um diese "zwischengespeicherte Entität" zurückzusetzen (die Sie über den obigen Link finden können):

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    prefs.edit().clear();
    PreferenceManager.setDefaultValues(this, R.xml.preferences, true);
rmanna
quelle
Die Lösung, die ich brauchte, war eine Kombination aus dieser Antwort und stackoverflow.com/a/9310697/1815624
CrandellWS
4

falls jemand durch gemeinsame Einstellungen in KOTLIN iterieren möchte

 sharedPreferences?.all?.forEach {
     //access key using it.key & value using it.value
     Log.d("Preferences values",it.key() + ": " + it.value()             
 }
anoo_radha
quelle