如何遍历共享首选项的所有键?


79

SharedPreferences具有方法getAll,但尽管存在某些键,但它不返回任何条目:

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

返回true

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

返回空地图

怎么了?如何获取所有共享首选项的列表?

Answers:


177

您可以做的是使用getAll()of的方法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
这对我来说没有任何
回报

3
getAll()可以返回NULL值。检查keysNULL会更好。
trante 2014年

3
最好使用entry.getValue()而不是entry.getValue().toString()不获取NullPointerException)
-Vlad

8

我认为问题更多与为什么有关

    PreferenceManager.getDefaultSharedPreferences(this).getAll()

返回一个空的/矛盾的映射,而不是如何遍历标准的Java映射。在Android的文档是不是真的晶莹剔透这是怎么回事这里,但基本上这似乎是有史以来第一次调用

    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

 sharedPreferences?.all?.forEach {
     //access key using it.key & value using it.value
     Log.d("Preferences values",it.key() + ": " + it.value()             
 }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.