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

Xåp*_* - 37 android android-preferences android-sharedpreferences

我已经实现了我自己的PreferenceFragment子类(在此详述),并希望在其中监听偏好更改.PreferenceFragment为您提供了两种执行此操作的方法:

getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
Run Code Online (Sandbox Code Playgroud)

getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*son 18

核心区别在于它们的名称,PreferenceManger允许开发人员访问不同的功能以进行管理SharedPreferences,例如检索当前首选项值的映射或设置用户首选项.到他们的默认值.PreferenceScreen处理显示用户首选项的屏幕,以便用户可以为它们分配值.有时这意味着在屏幕上显示具有其他首选项的列表项,这会在单击时打开另一个具有更多首选项的屏幕,就像PreferenceScreen嵌套s 时的情况一样.

你的问题意味着你认为什么PreferenceManager.getSharedPreferences()PreferenceScreen.getSharedPreferences()做什么之间存在差异,但根据源代码,它们是相同的.

PreferenceScreen:

public SharedPreferences getSharedPreferences() {
     if (mPreferenceManager == null) {
         return null;
     }

     return mPreferenceManager.getSharedPreferences();
 }
Run Code Online (Sandbox Code Playgroud)

所以PreferenceMangerPreferenceScreen是不同的实体,但SharedPreference那些方法返回应该是同一个对象,因为PreferenceScreen从中调用方法PreferenceManager.我希望这是你一直在寻找的答案.

如果你有一个选择,PreferenceManager.getSharedPreferences()那就更明显,内部的方法调用也少一些.

有趣的事实:

PreferenceFragment:

public PreferenceManager getPreferenceManager() {
    return mPreferenceManager;
}

public PreferenceScreen getPreferenceScreen() {
    return mPreferenceManager.getPreferenceScreen();
}
Run Code Online (Sandbox Code Playgroud)


Jos*_*ura 16

第一个从中获取共享首选项PreferenceManager.第二个,来自PreferenceScreen,从Preference类继承此方法.

我认为这不是功能差异,因为两者都可能返回SharedPreferences对象的相同实例,但我认为使用第一个实例(使用PreferenceManager而不是PreferenceScreen)更清楚.


Shr*_*uti 13

PreferenceScreen 在此处查看domentation

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

  • 当PreferenceActivity指向此时,它将用作根并且不显示(仅显示包含的首选项).
  • 当它出现在另一个首选项层次结构中时,它将显示并作为另一个首选项屏幕的网关(通过将另一个首选项屏幕显示为Dialog或通过getIntent()中的startActivity(android.content.Intent)显示.此PreferenceScreen的子项不会显示在显示此PreferenceScreen的屏幕中.而是单击此首选项时将显示单独的屏幕.

PreferenceManager 在这里查看文档:

差异:

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

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