Reputation: 22404
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.
Upvotes: 37
Views: 7938
Reputation: 5591
PreferenceScreen see domentation here
PreferenceScreen class can appear in two places:
- When a PreferenceActivity points to this, it is used as the root and is not shown (only the contained preferences are shown).
- When it appears inside another preference hierarchy, it is shown and serves as the gateway to another screen of preferences (either by showing another screen of preferences as a Dialog or via a
startActivity(android.content.Intent) from the getIntent()). The
children of this PreferenceScreen are NOT shown in the screen that
this PreferenceScreen is shown in. Instead, a separate screen will be shown when this preference is clicked.
PreferenceManager see documentation here.
Difference :
getPreferenceManager ()
returns the current preference manager associated with the fragment.
getPreferenceScreen ()
returns the root PreferenceScreen
i.e. root preference screen used in the fragment from preference xml file(preferences.xml).
Upvotes: 13
Reputation: 3890
The first one gets the shared preferences from the PreferenceManager
. The second one, from the PreferenceScreen
, that inherits this method from Preference
class.
I think this is not a functional difference, because both return probably the same instance of the SharedPreferences
objects, but I think it's clearer to use the first one (using PreferenceManager
instead of PreferenceScreen
).
Upvotes: 16
Reputation: 6035
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();
}
Upvotes: 18