PreferenceFragment - Difference between getPreferenceManager() and getPreferenceScreen()?

android, android-preferences, android-sharedpreferences

Solution

The core difference is in their names, `PreferenceManger` grants access to different functionalities to the developer for managing `SharedPreferences`, such as retrieving the map of current preference values or setting user preferences. to their default values. `PreferenceScreen` handles displaying a screen of user preferences, so that the user can assign values to them. Sometimes this means displaying a list item on a screen with other preferences, that opens another screen with more preferences when clicked, as is the case when `PreferenceScreen`s are nested.

Your question implies that you think there is a difference between what `PreferenceManager.getSharedPreferences()` and `PreferenceScreen.getSharedPreferences()` does, but according to the source code, they are identical.

`PreferenceScreen`:

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

     return mPreferenceManager.getSharedPreferences();
 }

So the `PreferenceManger` and `PreferenceScreen` are different entities, but the `SharedPreference` those method return should be the same object, since `PreferenceScreen` calls the method from `PreferenceManager`. I hope that is the answer you've been seeking.

If you have a choice, go with `PreferenceManager.getSharedPreferences()`, it's more obvious and one fewer method call internally.

Fun fact:

`PreferenceFragment`:

public PreferenceManager getPreferenceManager() {
    return mPreferenceManager;
}

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

Problem

I've implemented my own PreferenceFragment subclass (detailed here), and want to listen for preference changes within it. PreferenceFragment provides you with two ways of doing this: ``` getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); ``` and ``` getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); ``` Which one should be used? What's the difference? I don't really understand the distinction made in the Android docs.

Original source

Related problems