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(); } 

所以PreferenceMangerPreferenceScreen是不同的实体,但SharedPreference这些方法返回应该是相同的对象,因为PreferenceScreenPreferenceScreen调用方法。 我希望这是你一直在寻求的答案。

如果您有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选项屏幕。