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