【问题标题】:The use of Listening for preference changes聆听偏好变化的使用
【发布时间】:2014-09-29 14:08:36
【问题描述】:

在阅读了关于设置的 Android 文档后,我有几个关于监听偏好变化的问题

“有几个原因可能希望在用户更改其中一个首选项时立即收到通知。为了在任何一个首选项发生更改时接收回调,请实现 SharedPreference.OnSharedPreferenceChangeListener 接口并注册通过调用 registerOnSharedPreferenceChangeListener() 来监听 SharedPreferences 对象。"

我真的不明白,我找不到为什么实现这个监听器很重要,它有什么用?它有什么作用?什么时候使用它?现在,如果不实现侦听器,我的设置可以正常工作,对于任何设置或仅在特定情况下都至关重要吗? 谢谢。

资源:http://developer.android.com/guide/topics/ui/settings.html#Fragment

【问题讨论】:

  • 假设您将在用户更改任何内容后立即更改您的 PreferenceActivity/Fragment 中的首选项描述。那你就可以用了……
  • 如果你不需要它,不要使用它。

标签: android android-fragments sharedpreferences android-settings


【解决方案1】:

您不需要实现OnSharedPreferenceChangeListener。这是一种方便的功能。

有时您希望对偏好的变化立即做出反应。例如,如果您有一个“设置”操作,用户可以在其中更改活动的背景颜色,那么当用户进行选择时,您希望背景颜色立即更改,而不是在用户重新启动时更改活动。一种方法是让活动在onResume() 中检查背景首选项的状态,但另一种方法是让活动在onStart 中注册OnSharedPreferenceChangeListener 并(在onStop 中注销它)。我发现以这种方式使用监听器有时会导致代码更简单。当应该对设置更改做出反应的代码通常不参与框架的生命周期方法时,它也很有帮助。

实现OnSharedPreferenceChangeListener 非常简单。您只需要将您的类声明为implements OnSharedPreferenceChangeListener 或实现一个对象。例如:

public class MyActivity extends Activity {
    . . .
    private final OnSharedPreferenceChangeListener mPrefsListener =
        new OnSharedPreferenceChangeListener() {
            @Override
            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
                                                  String key)
            {
                if (key.equals(IMPORTANT_PREF_KEY)) {
                    setImportantValue(sharedPrefs.getInt(IMPORTANT_PREF_KEY, -1));
                }
            }
        };

    @Override
    protected void onStart() {
        super.onStart();
        PreferenceManager.getDefaultSharedPreferences(this)
            .registerOnSharedPreferenceChangeListener(mPrefsListener);
    }

    @Override
    protected void onStop() {
        super.onStop();
        PreferenceManager.getDefaultSharedPreferences(this)
            .unregisterOnSharedPreferenceChangeListener(mPrefsListener);
    }

    void setImportantValue(int value) {
         . . .
    }
}

【讨论】:

  • 哦,我明白了,谢谢,我该怎么做?开发人员的资源在解释这一点上真的很糟糕,哪个活动必须实现 OnSharedPreferenceChangeListener?保存我的片段的设置活动?我的片段?或将受更改影响的活动?
  • @james - 我添加了一些示例代码。您可以在任何可以访问SharedPreferences 对象的代码中使用OnSharedPreferenceChangeListener。它不一定是一个活动或片段(尽管它们通常是使用的地方)。
  • 你能解释一下setImportantValue(sharedPrefs.getInt(IMPORTANT_PREF_KEY, -1))这行吗?
  • @james - 好吧,setImportantValue() 是我发明的一些虚构方法,它可能对IMPORTANT_PREF_KEY 的当前首选项设置有用——另一个为某些首选项编造的 String 值。方法getInt(String key, int defaultValue)SharedPreferences API 的一部分;它将名为key 的首选项的值作为int 检索,如果未找到密钥,则返回defaultValue
  • 好的,谢谢,由于某种原因,onSharedPreferenceChanged 根本没有被调用。你知道为什么吗? (我有一个包含片段的 ViewPager(它实现了侦听器),并且我更改的设置负责处理片段内部的某些内容,但是当我尝试从 ViewPager 的活动中更改设置时,它不会对任何更改做出反应,仅在重新启动活动时才小心更改)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-21
  • 2020-10-12
  • 1970-01-01
  • 2012-11-15
  • 2015-07-06
相关资源
最近更新 更多