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.
In Android apps, there are often settings pages that contain different options the user can tweak. The PreferenceFragment and PreferenceFragmentCompat contains a hierarchy of preference objects displayed on screen in a list. These preferences will automatically save to SharedPreferences as the user interacts with them.
To inflate from XML, use the addPreferencesFromResource(int) . The root element should be a PreferenceScreen . Subsequent elements can point to actual Preference subclasses. As mentioned above, subsequent PreferenceScreen in the hierarchy will result in the screen break.
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(); }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With