Android PreferenceFragment-getPreferenceManager()和getPreferenceScreen()之间的差异?

Android PreferenceFragment-getPreferenceManager()和getPreferenceScreen()之间的差异?,android,android-preferences,android-sharedpreferences,Android,Android Preferences,Android Sharedpreferences,我已经实现了我自己的PreferenceFragment子类(detailed),并希望在其中监听偏好的更改。PreferenceFragment为您提供了两种方法: getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); 及 应该使用哪一种?有什么区别?我真的不明白。第一个从PreferenceManager获取共享首选项。第二个来自首选项屏幕,它从首选项类继承

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

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


应该使用哪一种?有什么区别?我真的不明白。

第一个从
PreferenceManager
获取共享首选项。第二个来自
首选项屏幕
,它从
首选项
类继承了此方法


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

PreferenceScreen请参见说明

PreferenceScreen类可以出现在两个位置:

  • 当PreferenceActivity指向此项时,它将用作根和 未显示(仅显示包含的首选项)
  • 当它出现在另一个首选项层次结构中时,它将显示并显示 作为另一个首选项屏幕的网关(通过 将另一个首选项屏幕显示为对话框或通过 getIntent()中的startActivity(android.content.Intent)。这个 此首选项屏幕的子项不会显示在 此首选项屏幕显示在中。相反,将使用一个单独的屏幕 单击此首选项时显示
首选项管理器请参阅文档:

差异

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


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

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

您的问题意味着您认为
PreferenceManager.getSharedReferences()
PreferenceScreen.getSharedReferences()
之间有区别,但根据源代码,它们是相同的

首选项屏幕

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

     return mPreferenceManager.getSharedPreferences();
 }
因此
PreferenceManager
PreferenceScreen
是不同的实体,但是那些方法返回的
SharedReference
应该是同一个对象,因为
PreferenceScreen
PreferenceManager
调用方法。我希望这就是你一直在寻找的答案

如果您有选择的话,可以使用
PreferenceManager.getSharedReferences()
,它更为明显,而且内部方法调用更少

有趣的事实:

PreferenceFragment

public PreferenceManager getPreferenceManager() {
    return mPreferenceManager;
}

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

从API中我所了解的情况来看,屏幕似乎更为具体,并不能真正保证出现,而Manager应该更经常地出现+一个好问题!为了澄清关于新的悬赏,除了Shurti和JoseLSegura已经回答的问题外,你还想知道什么。Shurti的回答主要是从API文档中复制/粘贴的,我已经读了好几遍了。何塞的答案更符合我的要求,但似乎不够权威。我只是想让其他人也参与进来。谢谢,这正是我想要的答案。我甚至没有想过要看Android的源代码。请分享源代码链接或帮助了解如何探索?在PreferenceScreen.java中没有名为GetSharedReferences()的方法。我已经从下面的链接探索。在这里找到
public PreferenceManager getPreferenceManager() {
    return mPreferenceManager;
}

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