【问题标题】:onSharedPreferenceChanged() never called after a clear()onSharedPreferenceChanged() 在 clear() 之后从未调用过
【发布时间】:2014-06-17 11:28:43
【问题描述】:

我在 SharedPreferences 及其侦听器中遇到了一种奇怪的行为。 我在我的应用程序中只使用了一个 SharedPreference 实例,我通过PreferenceManager.getDefaultSharedPreferences(this); 检索到

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

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

我有几个这个 SharedPreference 的监听器。它们都可以完美地添加/修改我的密钥。但是他们永远不会在重置时被解雇。该文档没有具体说明这种情况,但指出:

onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)

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

对我来说,重置就是删除所有偏好,所以我希望它会发生回调。

为什么没有发生? 非常感谢!

【问题讨论】:

  • 您是否要清除首选项值,这是单击重置按钮时想要的结果
  • 我清除(= 删除所有)首选项值,然后从我的文件 R.xml.settings 加载默认值。但两者都不会触发onSharedPreferenceChanged() 回调。
  • 我认为如果您清除 SP,侦听器也会被删除。没有关于 的文档,但也许在 clear() 之后,再次注册此侦听器。
  • @Dadou:我实际上并不了解您的上下文,但我可以建议一种解决方案,您可以在单击按钮时用旧值重写值..现在偏好值已更改..
  • @Opiatefuchs 我检查过:听众在清除前后收到修改,但不是清除本身。

标签: android sharedpreferences


【解决方案1】:

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

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

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

它也可以通过其他方式实现:在清除地图之前,只需几行代码就可以在修改后的键中记录现有共享偏好的keySet()

供参考:SharedPreferencesImpl source

【讨论】:

猜你喜欢
  • 2013-06-29
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
相关资源
最近更新 更多