【问题标题】:Notify other activity of a preference changed通知其他活动偏好已更改
【发布时间】:2012-12-02 16:44:12
【问题描述】:

我正在尝试让主要活动通知 PreferenceActivity 中的首选项发生变化,但是当我更改首选项时 onSharedPreferenceChanged 没有触发。

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    prefs.registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener()
    {   
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
        {
            Log.d("Dict", "PreferenceChanged: " + key);
        }
    });

【问题讨论】:

  • 你什么时候执行这段代码?

标签: java android


【解决方案1】:

我的猜测是(因为这是一个常见错误)您在 onResume() 中注册了侦听器并在 onPause() 中取消注册它。这将阻止听众开火。如果发生这种情况,将代码更改为在onCreate() 期间注册并在onDestroy() 期间取消注册将解决问题。

【讨论】:

  • 我真的应该删除监听器吗?我正在使用匿名类。
  • @piotr - 当您不删除监听器时,即使在活动被销毁后它也会被调用。例如,当用户简单地旋转设备时,就会发生这种情况。为被破坏的活动调用监听器可能会导致各种问题。
  • @TedHopp 你完全正确,我使用的是onPause() 和onResume()。文档建议:developer.android.com/guide/topics/ui/settings.html#Listening
  • @RafaelOliveira - 是的,我不知道为什么文档会推荐生命周期的那个阶段。我想它在检测由另一个线程引起的首选项更改方面有其用途,但我一直更感兴趣的是通过(例如)将我的活动推到后台(并因此暂停它)的首选项活动来通知更改。在 onPause 中取消注册完全失败了。
【解决方案2】:

您可以使用此代码 根据他的键找到什么偏好当前值变化

公共类 SharedPreferences 实现 OnSharedPreferenceChangeListener {

@Override
public void onSharedPreferenceChanged(
        android.content.SharedPreferences sharedPreferences, String key) {
    // TODO Auto-generated method stub

    sharedPreferences.getBoolean(key, defValue);
    sharedPreferences.getFloat(key,defValue);
    sharedPreferences.getInt(key, defValue);
    sharedPreferences.getString(key, defValue);
    sharedPreferences.getString(key, defValue);
}

}

【讨论】:

  • 这基本上不是 OP 已经在做的事情吗?问题是 onSharedPreferenceChanged 没有被调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
  • 2019-11-17
  • 1970-01-01
相关资源
最近更新 更多