Jak iterować przez wszystkie klucze wspólnych preferencji?

79

SharedPreferences ma metodę getAll, ale nie zwraca ona żadnych wpisów pomimo faktu, że istnieją klucze:

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

zwraca prawdę

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

zwraca pustą mapę

Co jest nie tak? Jak uzyskać listę wszystkich wspólnych preferencji?

Eugene Chumak
źródło

Odpowiedzi:

177

To, co możesz zrobić, to użyć getAll()metody SharedPreferencesi pobrać wszystkie wartości, Map<String,?>a następnie możesz łatwo iterować.

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

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

Po więcej możesz sprawdzić realizację.PrefUtil.java's dump()

Lalit Poptani
źródło
3
to nie zwraca żadnych wartości dla mnie :(
uniruddh
3
getAll()może zwrócić NULLwartość. Byłoby lepiej sprawdzić keysNULL.
trante
3
Lepiej użyć entry.getValue(), niż entry.getValue().toString()nie dostać NullPointerException)
Vlad
8

myślę, że pytanie ma więcej wspólnego z tym, dlaczego

    PreferenceManager.getDefaultSharedPreferences(this).getAll()

zwraca pustą / sprzeczną mapę niż w przypadku iteracji po standardowej mapie java. android doc naprawdę nie jest krystalicznie czysta, co się dzieje tutaj, ale w zasadzie wydaje się, że pierwsze wezwanie kiedykolwiek do

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

- co powinieneś wywołać, aby zainicjować preferencje podczas uruchamiania aplikacji - tworzy jakąś buforowaną wersję twoich preferencji, która powoduje, że przyszłe zmiany w twoim pliku preferencji xml będą niespójnie obsługiwane, tj. powodując niedopasowanie opisane w Twoim pytaniu.

aby zresetować tę „jednostkę w pamięci podręcznej”, wykonaj następujące kroki (które można znaleźć w powyższym linku):

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    prefs.edit().clear();
    PreferenceManager.setDefaultValues(this, R.xml.preferences, true);
rmanna
źródło
rozwiązaniem, którego potrzebowałem, było połączenie tej odpowiedzi i stackoverflow.com/a/9310697/1815624
CrandellWS
4

na wypadek, gdyby ktoś chciał iterować poprzez wspólne preferencje w KOTLINIE

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