Как перебирать все ключи общих настроек?
У 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);