Bra*_*ein 68 android sharedpreferences
我onSharedPreferenceChanged在我的主要活动中实施了.
如果我更改主活动中的首选项,则会触发我的事件.
如果我通过我的首选项屏幕更改首选项(PreferenceActivity)我的事件不会在首选项被更改时触发(因为它是一个单独的活动和对sharedPreferences的单独引用?)
有人建议我应该如何克服这种情况?
谢谢!
EDIT1:我尝试在我的首选项活动中添加事件处理程序但它永远不会触发.在我的首选项活动的onCreate期间调用以下方法.当我更改值时,它永远不会打印消息(msg()是包装器Log.d).
private void registerChangeListener () {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
sp.registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener () {
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
msg (" ***** Shared Preference Update ***** ");
Intent i = new Intent();
i.putExtra("KEY", key);
i.setAction("com.gtosoft.dash.settingschanged");
sendBroadcast(i);
// TODO: fire off the event
}
});
}
Run Code Online (Sandbox Code Playgroud)
thu*_*eys 136
在OnSharedPreferenceChangeListener得到收集在你的情况,如果您使用匿名类垃圾.
要解决该问题,请使用以下代码PreferenceActivity注册和取消注册更改侦听器:
public class MyActivity extends PreferenceActivity implements
OnSharedPreferenceChangeListener {
@Override
protected void onResume() {
super.onResume();
// Set up a listener whenever a key changes
getPreferenceScreen().getSharedPreferences()
.registerOnSharedPreferenceChangeListener(this);
}
@Override
protected void onPause() {
super.onPause();
// Unregister the listener whenever a key changes
getPreferenceScreen().getSharedPreferences()
.unregisterOnSharedPreferenceChangeListener(this);
}
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key)
{
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
此外要注意,只有在实际值发生变化时才会调用侦听器.再次设置相同的值不会触发侦听器.
另请参见SharedPreferences.onSharedPreferenceChangeListener未被一致地调用
小智 14
这是因为垃圾收集器.它的作品只有一次.然后将引用收集为垃圾.所以为监听器创建实例字段.
private OnSharedPreferenceChangeListener listner;
listner = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
//implementation goes here
}
};
prefs.registerOnSharedPreferenceChangeListener(listner);
Run Code Online (Sandbox Code Playgroud)
我和许多其他人一样来到这里,因为当我将布尔值true改为false,或者反之,我的听众不会被解雇.
在经过多次阅读,重构,切换contexts/inner classes/privates/static/等之后,我意识到了我的(愚蠢)错误:
将onSharedPreferenceChanged是唯一的,如果有新的变化叫.只要.永远.
在我的测试中,我总是愚蠢地一直点击相同的按钮,因此始终为首选项分配相同的布尔值,因此它永远不会改变.
希望这有助于某人!
| 归档时间: |
|
| 查看次数: |
49269 次 |
| 最近记录: |