PreferenceFragment – getPreferenceManager()和getPreferenceScreen()之间的区别?
我已经实现了我自己的PreferenceFragment子类(详细在这里 ),并希望听取其中的偏好更改。 PreferenceFragment为您提供了两种执行此操作的方法:
getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); 和
 getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); 
哪一个应该使用? 有什么不同? 我真的不明白在Android文档中所做的区别 。
 核心区别在于它们的名称, PreferenceManger授予开发人员访问不同function的权限,以pipe理SharedPreferences ,例如检索当前首选项值的映射或设置用户首选项。 到默认值。  PreferenceScreen处理显示用户首选项的屏幕,以便用户可以为其分配值。 有时,这意味着在其他首选项的屏幕上显示一个列表项目,当单击PreferenceScreen时,会打开具有更多首选项的另一个屏幕。 
 您的问题意味着您认为PreferenceManager.getSharedPreferences()和PreferenceScreen.getSharedPreferences()之间存在差异,但是根据源代码,它们是相同的。 
  PreferenceScreen : 
 public SharedPreferences getSharedPreferences() { if (mPreferenceManager == null) { return null; } return mPreferenceManager.getSharedPreferences(); } 
 所以PreferenceManger和PreferenceScreen是不同的实体,但SharedPreference这些方法返回应该是相同的对象,因为PreferenceScreen从PreferenceScreen调用方法。 我希望这是你一直在寻求的答案。 
 如果您有select,请使用PreferenceManager.getSharedPreferences() ,这更明显,内部方法更less。 
有趣的事实:
  PreferenceFragment : 
 public PreferenceManager getPreferenceManager() { return mPreferenceManager; } public PreferenceScreen getPreferenceScreen() { return mPreferenceManager.getPreferenceScreen(); } 
 第一个从PreferenceManager获取共享首PreferenceManager 。 第二个是PreferenceScreen ,它从Preference类inheritance这个方法。 
 我认为这不是一个function差异,因为两者都可能返回与SharedPreferences对象相同的实例,但我认为使用第一个(使用PreferenceManager而不是PreferenceScreen )更清晰。 
PreferenceScreen 在这里看到domentation
PreferenceScreen类可以出现在两个地方:
- 当一个PreferenceActivity指向这个时,它被用作根并且不显示(只显示包含的首选项)。
- 当它显示在另一个首选项层次结构中时,它将显示并用作另一个首选项屏幕的网关(通过显示另一个首选项屏幕作为对话框或通过getIntent()中的startActivity(android.content.Intent))。 此PreferenceScreen的子项不显示在显示PreferenceScreen的屏幕中,而是单击此首选项时显示单独的屏幕。
PreferenceManager 在这里看到文档:
区别 :
  getPreferenceManager ()返回与片段关联的当前偏好pipe理器。 
  getPreferenceScreen ()返回根PreferenceScreen即从首选项xml文件(preferences.xml)中的片段中使用的根PreferenceScreen选项屏幕。