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
选项屏幕。