How to listen for preference changes within a PreferenceFragment?
I believe you just need to register/unregister the Listener
in your PreferenceFragment
and it will work.
@Overridepublic void onResume() { super.onResume(); getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);}@Overridepublic void onPause() { getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); super.onPause();}
Depending on what you want to do you may not need to use a listener. Changes to the preferences are committed to SharedPreferences
automatically.
The solution of antew works well, here you can see a full preference activity for Android v11 onwards:
import android.app.Activity;import android.content.SharedPreferences;import android.content.SharedPreferences.OnSharedPreferenceChangeListener;import android.os.Bundle;import android.preference.ListPreference;import android.preference.PreferenceFragment;public class UserPreferencesV11 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Display the fragment as the main content. getFragmentManager().beginTransaction().replace(android.R.id.content, new PrefsFragment()).commit();}public static class PrefsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Load the preferences from an XML resource addPreferencesFromResource(R.xml.preferences); // set texts correctly onSharedPreferenceChanged(null, ""); } @Override public void onResume() { super.onResume(); // Set up a listener whenever a key changes getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); } @Override public void onPause() { super.onPause(); // Set up a listener whenever a key changes getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { // just update all ListPreference lp = (ListPreference) findPreference(PREF_YOUR_KEY); lp.setSummary("dummy"); // required or will not update lp.setSummary(getString(R.string.pref_yourKey) + ": %s"); }}}
All the other answers are correct. But I like this alternative better because you immediately have the Preference instance that caused the change.
@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Preference pref = findPreference(getString(R.string.key_of_pref)); pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { // do whatever you want with new value // true to update the state of the Preference with the new value // in case you want to disallow the change return false return true; } });}