【发布时间】:2012-05-16 11:13:57
【问题描述】:
我有
SharedPreferences myPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
和
myPreferences.getBoolean("checkbox", true)
那么,我的主要活动如何知道用户何时更改偏好状态? 例如,如果用户不想再收到通知。 谢谢。
【问题讨论】:
我有
SharedPreferences myPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
和
myPreferences.getBoolean("checkbox", true)
那么,我的主要活动如何知道用户何时更改偏好状态? 例如,如果用户不想再收到通知。 谢谢。
【问题讨论】:
您可以重新阅读Activity.onResume() 中的所有首选项,或者只要您的主要活动启动首选项活动(例如从菜单),您可以使用startActivityForResult(Intent, int) 启动并重新阅读所有首选项onActivityResult(int, int, Intent).
我还发现在开始适当的行为之前重新检查每个相关首选项就足够了(即在您的示例中发出 Notification 之前)。
【讨论】:
您需要实现 onSharedPreferenceChangeListener 接口。然后注册以在您的 onCreate/onStart 中接收更改更新:
myPreferences.registerOnSharedPreferenceChangeListener();
在你的监听器中你做这样的事情:
@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if (key.equals("MyKey")) {
// Do something.
} else if (key.equals("MyOtherKey")) {
// Do something else.
}
}
记得在 onStop/onDestroy 中移除监听器。
【讨论】:
您可以创建一个静态布尔值,该值会在首选项更改或您的首选项活动开始时更改。这个布尔值的目的是让你的主要活动知道偏好是脏的,需要重新加载。如果mDirty 标志为真,它们应该重新加载onResume。
另一种选择是重新加载所有首选项onResume,无论如何。这可能效率不高,但如果您没有大量偏好,那也没关系。
最有效的方法是为您的首选项活动中的所有首选项设置 onPreferenceChanged 侦听器,然后首选项仅在实际更改时通知活动。这解决了当您的用户进入您的偏好活动但实际上并没有改变任何东西时的情况。
【讨论】: