37

我已经实现了我自己的 PreferenceFragment 子类(在此处详细介绍),并希望在其中监听偏好更改。PreferenceFragment 为您提供了两种方法:

getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);

getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);

应该使用哪一个?有什么不同?我不太了解Android 文档中的区别

4

3 回答 3

18

核心区别在于它们的名称,PreferenceManger授予开发人员对不同功能的访问权限以进行管理SharedPreferences,例如检索当前偏好值的映射或设置用户偏好。到他们的默认值。PreferenceScreen处理显示用户偏好的屏幕,以便用户可以为它们分配值。有时这意味着在具有其他首选项的屏幕上显示一个列表项,单击时会打开另一个具有更多首选项的屏幕,就像PreferenceScreen嵌套 s 的情况一样。

您的问题意味着您认为 whatPreferenceManager.getSharedPreferences()PreferenceScreen.getSharedPreferences()does 之间存在差异,但根据源代码,它们是相同的。

PreferenceScreen

public SharedPreferences getSharedPreferences() {
     if (mPreferenceManager == null) {
         return null;
     }

     return mPreferenceManager.getSharedPreferences();
 }

所以PreferenceMangerandPreferenceScreen是不同的实体,但是SharedPreference那些方法返回应该是同一个对象,因为PreferenceScreenPreferenceManager. 我希望这就是你一直在寻找的答案。

如果您有选择,请使用PreferenceManager.getSharedPreferences(),它更明显并且内部方法调用更少。

有趣的事实:

PreferenceFragment

public PreferenceManager getPreferenceManager() {
    return mPreferenceManager;
}

public PreferenceScreen getPreferenceScreen() {
    return mPreferenceManager.getPreferenceScreen();
}
于 2012-12-18T22:04:25.997 回答
16

第一个从PreferenceManager. 第二个,来自,从类PreferenceScreen继承这个方法。Preference

我认为这不是功能上的差异,因为两者都可能返回相同的SharedPreferences对象实例,但我认为使用第一个(使用PreferenceManager而不是PreferenceScreen)更清楚。

于 2012-12-02T23:36:33.783 回答
13

PreferenceScreen在这里看到 domentation

PreferenceScreen 类可以出现在两个地方:

  • 当 PreferenceActivity 指向它时,它被用作根并且不显示(仅显示包含的首选项)。
  • 当它出现在另一个首选项层次结构中时,它会被显示并用作另一个首选项屏幕的网关(通过将另一个首选项屏幕显示为对话框或通过 getIntent() 中的 startActivity(android.content.Intent))。此 PreferenceScreen 的子项不会显示在显示此 PreferenceScreen 的屏幕中。相反,单击此首选项时将显示一个单独的屏幕。

PreferenceManager在此处查看文档:

区别

getPreferenceManager ()返回与片段关联的当前首选项管理器。

getPreferenceScreen ()PreferenceScreen从首选项 xml 文件 (preferences.xml)返回片段中使用的根,即根首选项屏幕。

于 2012-12-03T06:47:02.720 回答