PreferenceFragment - getPreferenceManager() 和 getPreferenceScreen() 之间的区别?

问题描述 投票:0回答:3

我已经实现了自己的 PreferenceFragment 子类(详细信息here),并且想要监听其中的首选项更改。 PreferenceFragment 为您提供了两种执行此操作的方法:

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

getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);

应该使用哪一个?有什么不同?我不太明白 Android 文档中的区别

android android-preferences android-sharedpreferences
3个回答
18
投票

核心区别在于它们的名称,

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

16
投票

第一个从

PreferenceManager
获取共享偏好。第二个来自
PreferenceScreen
,它从
Preference
类继承此方法。

我认为这不是功能差异,因为两者可能返回

SharedPreferences
对象的相同实例,但我认为使用第一个更清楚(使用
PreferenceManager
而不是
PreferenceScreen
)。


13
投票

首选项屏幕请参阅文档此处

PreferenceScreen 类可以出现在两个地方:

  • 当 PreferenceActivity 指向它时,它被用作根并且不显示(仅显示包含的首选项)。
  • 当它出现在另一个首选项层次结构中时,它会被显示并充当通往另一个首选项屏幕的网关(或者 通过将另一个首选项屏幕显示为对话框或通过
    startActivity(android.content.Intent) 来自 getIntent())。
    此 PreferenceScreen 的子项不会显示在
    的屏幕中 此 PreferenceScreen 显示在其中。相反,将显示一个单独的屏幕 单击此首选项时显示。

PreferenceManager 请参阅文档此处

区别

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

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

© www.soinside.com 2019 - 2024. All rights reserved.