PreferenceFragment - getPreferenceManager()和getPreferenceScreen()之间的区别是什么?

37
我实现了自己的PreferenceFragment子类(详见此处),并希望在其中监听偏好更改。PreferenceFragment提供了两种方法来实现这一点:
getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);

并且

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

哪一个应该被使用?有什么区别?我真的不理解Android文档中所做的区分

2
从API中我所了解的情况是,Screen更具体,而且并不一定保证存在,而Manager则应该更常见。对于这个好问题点赞! - A--C
只是为了澄清关于更新的赏金,除了Shruti和JoseLSegura已经回答过的内容,您还想知道什么? - Gunnar Karlsson
Shruti的回答大部分是从API文档中复制/粘贴的,而我已经读过几遍了。Jose的回答更符合我的需求,但似乎不够权威。我只是想让其他人来发表意见。 - XåpplI'-I0llwlg'I -
3个回答

18
核心区别在于它们的名称,PreferenceManger 允许开发者访问不同的功能来管理 SharedPreferences,例如检索当前首选项值的映射或将用户偏好设置为其默认值。 PreferenceScreen 处理显示用户偏好设置屏幕,以便用户可以为它们分配值。有时,这意味着在屏幕上显示一个带有其他偏好设置的列表项,在单击时打开另一个屏幕以显示更多偏好设置,这就是嵌套 PreferenceScreen 的情况。
您的问题表明您认为 PreferenceManager.getSharedPreferences()PreferenceScreen.getSharedPreferences() 有所不同,但根据源代码,它们是相同的。 PreferenceScreen:
public SharedPreferences getSharedPreferences() {
     if (mPreferenceManager == null) {
         return null;
     }

     return mPreferenceManager.getSharedPreferences();
 }
所以,PreferenceManagerPreferenceScreen是不同的实体,但这些方法返回的SharedPreference对象应该是相同的,因为PreferenceScreenPreferenceManager调用该方法。希望这就是你一直在寻找的答案。
如果可以选择,建议使用PreferenceManager.getSharedPreferences(),它更加明显且在内部少调用了一个方法。
有趣的事实: PreferenceFragment
public PreferenceManager getPreferenceManager() {
    return mPreferenceManager;
}

public PreferenceScreen getPreferenceScreen() {
    return mPreferenceManager.getPreferenceScreen();
}

1
谢谢,这正是我在寻找的答案。我甚至没有想到去查看Android源代码。 - XåpplI'-I0llwlg'I -
请分享源代码链接或有关如何探索的帮助?在PreferenceScreen.java中没有名为getSharedPreferences()的方法。我已经从以下链接中进行了探索。https://android.googlesource.com/platform/frameworks/support/+/bd4cbab/v7/preference/src/android/support/v7/preference/PreferenceScreen.java - Android Developer
请在此处查找:https://android.googlesource.com/platform/frameworks/support/+/bd4cbab/v7/preference/src/android/support/v7/preference/Preference.java - Android Developer

16

第一个从PreferenceManager获取共享首选项,第二个从PreferenceScreen获取,它从Preference类继承了这个方法。

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


13

PreferenceScreen看文档这里

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

  • 当PreferenceActivity指向它时,它被用作根元素并且不可见(只显示包含的首选项)。
  • 当它出现在另一个首选项层次结构中时,它会显示并作为访问另一个首选项屏幕的入口(可以通过以对话框形式显示另一个首选项屏幕,或者通过从getIntent()启动startActivity(android.content.Intent))。此PreferenceScreen的子项不会显示在当前屏幕中。相反,单击此首选项时将显示单独的屏幕。

PreferenceManager看文档这里

区别

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

getPreferenceScreen() 返回根PreferenceScreen,即从偏好设置 XML 文件(preferences.xml)中使用的片段中的根偏好设置屏幕。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接