【问题标题】:How to update main activity to know that prefs are changed?如何更新主要活动以知道首选项已更改?
【发布时间】:2012-05-16 11:13:57
【问题描述】:

我有

SharedPreferences myPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

myPreferences.getBoolean("checkbox", true)

那么,我的主要活动如何知道用户何时更改偏好状态? 例如,如果用户不想再收到通知。 谢谢。

【问题讨论】:

    标签: java android


    【解决方案1】:

    您可以重新阅读Activity.onResume() 中的所有首选项,或者只要您的主要活动启动首选项活动(例如从菜单),您可以使用startActivityForResult(Intent, int) 启动并重新阅读所有首选项onActivityResult(int, int, Intent).

    我还发现在开始适当的行为之前重新检查每个相关首选项就足够了(即在您的示例中发出 Notification 之前)。

    【讨论】:

      【解决方案2】:

      您需要实现 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 中移除监听器。

      【讨论】:

      • 我试过 registerOnSharedPreferenceChangeListener() 但它不起作用。默认情况下,首选项复选框设置为 true,所以当用户更改它时,我想停止服务工作?
      • 你在哪里设置默认值?我使用'PreferenceManager.setDefaultValues(this,R.xml.preferences,false)'。 setDefaultValues 和 registerOnSharedPreferenceChangeListener 都发生在我的服务中。您确定您的服务在更改时正常工作吗?
      • 我在here找到了解决方案
      • 这也很高兴知道。心理提示:不要为偏好回调取消匿名内部类。
      【解决方案3】:

      您可以创建一个静态布尔值,该值会在首选项更改或您的首选项活动开始时更改。这个布尔值的目的是让你的主要活动知道偏好是脏的,需要重新加载。如果mDirty 标志为真,它们应该重新加载onResume

      另一种选择是重新加载所有首选项onResume,无论如何。这可能效率不高,但如果您没有大量偏好,那也没关系。

      最有效的方法是为您的首选项活动中的所有首选项设置 onPreferenceChanged 侦听器,然后首选项仅在实际更改时通知活动。这解决了当您的用户进入您的偏好活动但实际上并没有改变任何东西时的情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-26
        • 1970-01-01
        • 1970-01-01
        • 2012-10-03
        • 2011-04-25
        • 2010-12-30
        • 1970-01-01
        相关资源
        最近更新 更多