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

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

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

возвращает true

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

возвращает пустую карту

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

Ответ 1

Что вы можете сделать, это использовать 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() реализацию.

Ответ 2

Я думаю, что этот вопрос больше связан с тем, почему

    PreferenceManager.getDefaultSharedPreferences(this).getAll()

возвращает пустое/противоречивое отображение, чем с тем, как перебирать стандартную java-карту. android doc на самом деле не очень ясен, что происходит здесь, но в основном это похоже на первый вызов на

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

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

to reset этот "кэшированный объект", выполните следующие действия (которые вы можете найти из приведенной выше ссылки):

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