Как перебрать все ключи общих настроек?


79

SharedPreferences имеет метод getAll, но он не возвращает никаких записей, несмотря на то, что некоторые ключи существуют:

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

возвращает истину

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на NULL.
trante

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.