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

82

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

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

返回 true

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

返回空映射

有什么问题吗?如何获取所有共享偏好列表?

4个回答

184

您可以使用SharedPreferencesgetAll()方法,获取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 中的 dump() 实现。


4
这对我来说没有返回任何值 :( - uniruddh
4
getAll() 可能会返回 NULL 值。最好检查 keys 是否为 NULL - trante
3
最好使用entry.getValue()而不是entry.getValue().toString()以避免出现空指针异常。 - Vlad

9

我认为这个问题更多地涉及为什么的原因。

    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);

我需要的解决方案是这个答案和https://dev59.com/3Gox5IYBdhLWcg3wSCVW#9310697的结合。 - CrandellWS

4

如果有人想在 Kotlin 中迭代 SharedPreferences,请参考以下内容:

 sharedPreferences?.all?.forEach {
     //access key using it.key & value using it.value
     Log.d("Preferences values",it.key() + ": " + it.value()             
 }

0
在 Kotlin 中非常容易,您可以更改 FILE_PREF_XML 以获取您的首选项文件。
getSharedPreferences("FILE_PREF_XML", Context.MODE_PRIVATE).all?.forEach {
    Log.d(TAG,"shared pref(" + it.key + ") = " + it.value)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接