我在使用SharedPreferences及其监听器时遇到了奇怪的行为。
我在我的应用中只使用了一个使用PreferenceManager.getDefaultSharedPreferences(this);
在我的PreferenceFragment中,我有一个按钮可将首选项重置为默认值。这就是它的作用:
PreferenceManager.getDefaultSharedPreferences(getActivity()).edit().clear().commit();
PreferenceManager.setDefaultValues(getActivity(), R.xml.settings, true);
我为这个SharedPreference提供了几个监听器。它们都完美地用于添加/修改我的键。但他们永远不会被解雇重置。该文件并不具体针对此案例,但声明:
onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key)
更改,添加或删除共享首选项时调用。
对我而言,重置是删除所有首选项,因此我预计会发生回调。
为什么不发生? 非常感谢!
答案 0 :(得分:7)
这是一个功能,并没有真正记录好。这是基于阅读来源的解释。
将共享首选项视为可以在大容量内存中持久保存的键值Map
。然后将SharedPreferences.Editor
视为另一个Map
,仅存储要应用于apply()
或commit()
的修改。删除存储为null
值。 clear()
在编辑器中实现为布尔标志,设置后,在应用更改之前清除目标共享首选项映射。
每个键都会通知听众。在清除之前,没有关于共享首选项映射中的密钥的信息。因此,您只会收到有关在编辑器中由键名指定的更改的通知。
它也可以以其他方式实现:在清除映射之前,只需几行代码就可以在已修改的键中记录现有共享首选项的keySet()
。