onSharedPreferenceChanged()从未在clear()之后调用

时间:2014-06-17 11:28:44

标签: android sharedpreferences

我在使用SharedPreferences及其监听器时遇到了奇怪的行为。 我在我的应用中只使用了一个使用PreferenceManager.getDefaultSharedPreferences(this);

检索的SharedPreference实例

在我的PreferenceFragment中,我有一个按钮可将首选项重置为默认值。这就是它的作用:

PreferenceManager.getDefaultSharedPreferences(getActivity()).edit().clear().commit();
PreferenceManager.setDefaultValues(getActivity(), R.xml.settings, true);

我为这个SharedPreference提供了几个监听器。它们都完美地用于添加/修改我的键。但他们永远不会被解雇重置。该文件并不具体针对此案例,但声明:

  

onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key)

     

更改,添加或删除共享首选项时调用。

对我而言,重置是删除所有首选项,因此我预计会发生回调。

为什么不发生? 非常感谢!

1 个答案:

答案 0 :(得分:7)

这是一个功能,并没有真正记录好。这是基于阅读来源的解释。

将共享首选项视为可以在大容量内存中持久保存的键值Map。然后将SharedPreferences.Editor视为另一个Map,仅存储要应用于apply()commit()的修改。删除存储为null值。 clear()在编辑器中实现为布尔标志,设置后,在应用更改之前清除目标共享首选项映射。

每个键都会通知听众。在清除之前,没有关于共享首选项映射中的密钥的信息。因此,您只会收到有关在编辑器中由键名指定的更改的通知。

它也可以以其他方式实现:在清除映射之前,只需几行代码就可以在已修改的键中记录现有共享首选项的keySet()

供参考:SharedPreferencesImpl source