我已经实现了自己的PreferenceFragment子类(详细的here),并希望在其中监听首选项的更改。 PreferenceFragment为您提供了两种方法:

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


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

应该使用哪一个?有什么不同?我不太了解distinction made in the Android docs

最佳答案

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

您的问题暗示您认为PreferenceManager.getSharedPreferences()PreferenceScreen.getSharedPreferences()之间有区别,但是根据源代码,它们是相同的。
PreferenceScreen:

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

     return mPreferenceManager.getSharedPreferences();
 }

因此PreferenceMangerPreferenceScreen是不同的实体,但是这些方法返回的SharedPreference应该是同一对象,因为PreferenceScreenPreferenceManager调用了该方法。我希望这是您一直在寻找的答案。

如果可以选择的话,请使用PreferenceManager.getSharedPreferences(),它更明显,内部调用的方法也更少。

有趣的事实:
PreferenceFragment:
public PreferenceManager getPreferenceManager() {
    return mPreferenceManager;
}

public PreferenceScreen getPreferenceScreen() {
    return mPreferenceManager.getPreferenceScreen();
}

10-07 19:22
查看更多