Як переглядати всі ключі спільних уподобань?


79

SharedPreferences має метод getAll, але він не повертає записів, незважаючи на те, що існують деякі ключі:

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

повертає true

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

повертає порожню карту

Що не так? Як отримати список усіх спільних уподобань?

Відповіді:


177

Що ви можете зробити, це скористатися getAll()методом SharedPreferencesі отримати всі значення, Map<String,?>і тоді ви можете легко перебирати.

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

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

Щоб отримати більше, ви можете перевірити реалізацію.PrefUtil.java's dump()


3
це не повертає для мене ніяких значень :(
uniruddh

3
getAll()може повернути NULLзначення. Краще було б перевірити keysНУЛЬ.
транте

3
Краще використовувати, entry.getValue()а не entry.getValue().toString()не отримувати NullPointerException)
Влад

8

я думаю, що питання має більше спільного з тим, чому

    PreferenceManager.getDefaultSharedPreferences(this).getAll()

повертає порожню / суперечливу карту, ніж те, як перебирати стандартну карту Java. андроїд документ насправді не кристально ясно про те, що відбувається тут , але в основному це здається, що перший виклик коли - або в

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

- це те, що ви повинні зателефонувати для ініціалізації налаштувань під час запуску програми - створює якусь кешовану версію ваших налаштувань, яка призводить до того, що майбутні зміни у вашому файлі налаштувань xml будуть послідовно оброблятися, тобто, спричиняючи невідповідність вам описані у вашому запитанні.

щоб скинути цю "кешовану сутність", виконайте наступні дії (які ви можете начебто придумати з наведеного вище посилання):

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

потрібним рішенням було поєднання цієї відповіді та stackoverflow.com/a/9310697/1815624
CrandellWS

4

якщо хтось хоче повторити через спільні налаштування в KOTLIN

 sharedPreferences?.all?.forEach {
     //access key using it.key & value using it.value
     Log.d("Preferences values",it.key() + ": " + it.value()             
 }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.