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

Eug*_*mak 76 android sharedpreferences

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

PreferenceManager.getDefaultSharedPreferences(this).contains("addNewAddress");
Run Code Online (Sandbox Code Playgroud)

返回true

Map<String, ?> keys=PreferenceManager.getDefaultSharedPreferences(this).getAll();
Run Code Online (Sandbox Code Playgroud)

返回空地图

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

Lal*_*ani 174

您可以做的是使用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());            
 }
Run Code Online (Sandbox Code Playgroud)

您可以查看实施情况.PrefUtil.java's dump()

  • 这对我没有返回值:( (3认同)
  • `getAll()`可以返回'NULL`值.检查`keys`是否为NULL会更好. (3认同)
  • 这是更好地利用``entry.getValue()``而不是``entry.getValue().的toString()``不要让空指针异常) (3认同)

rma*_*nna 8

我认为这个问题与原因有关

    PreferenceManager.getDefaultSharedPreferences(this).getAll()
Run Code Online (Sandbox Code Playgroud)

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

    PreferenceManager.setDefaultValues(this, R.xml.preferences,false)
Run Code Online (Sandbox Code Playgroud)

- 当您启动应用程序时,您应该调用初始化首选项 - 创建某种缓存版本的首选项,这会导致您对xml首选项文件的未来更改处理不一致,即导致不匹配在你的问题中描述.

要重置此"缓存实体",请按照以下步骤操作(您可以从上面的链接中找到):

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    prefs.edit().clear();
    PreferenceManager.setDefaultValues(this, R.xml.preferences, true);
Run Code Online (Sandbox Code Playgroud)