如果在单独的活动中发生更改,onSharedPreferenceChanged不会被触发?

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未被一致地调用

  • 噢,你摇滚!多么棘手!!! 我的onsharedpreferencelistener被垃圾收集!所以根据你的链接,我创建了一个长期参考(全局成员变量),瞧,它很棒! (2认同)

小智 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)


mrA*_*ias 7

我和许多其他人一样来到这里,因为当我将布尔值true改为false,或者反之,我的听众不会被解雇.

在经过多次阅读,重构,切换contexts/inner classes/privates/static/等之后,我意识到了我的(愚蠢)错误:

onSharedPreferenceChanged唯一的,如果有新的变化叫.只要.永远.

在我的测试中,我总是愚蠢地一直点击相同的按钮,因此始终为首选项分配相同的布尔值,因此它永远不会改变.

希望这有助于某人!