SharedPreferences有一个getAll方法,但尽管存在某些键,它并不返回任何条目:
PreferenceManager.getDefaultSharedPreferences(this).contains("addNewAddress");
返回 true
Map<String, ?> keys=PreferenceManager.getDefaultSharedPreferences(this).getAll();
返回空映射
有什么问题吗?如何获取所有共享偏好列表?
SharedPreferences有一个getAll方法,但尽管存在某些键,它并不返回任何条目:
PreferenceManager.getDefaultSharedPreferences(this).contains("addNewAddress");
返回 true
Map<String, ?> keys=PreferenceManager.getDefaultSharedPreferences(this).getAll();
返回空映射
有什么问题吗?如何获取所有共享偏好列表?
您可以使用SharedPreferences
的getAll()
方法,获取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()
实现。
我认为这个问题更多地涉及为什么的原因。
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);
如果有人想在 Kotlin 中迭代 SharedPreferences,请参考以下内容:
sharedPreferences?.all?.forEach {
//access key using it.key & value using it.value
Log.d("Preferences values",it.key() + ": " + it.value()
}
getSharedPreferences("FILE_PREF_XML", Context.MODE_PRIVATE).all?.forEach {
Log.d(TAG,"shared pref(" + it.key + ") = " + it.value)
}
getAll()
可能会返回NULL
值。最好检查keys
是否为NULL
。 - tranteentry.getValue()
而不是entry.getValue().toString()
以避免出现空指针异常。 - Vlad