How to listen for preference changes within a PreferenceFragment? How to listen for preference changes within a PreferenceFragment? android android

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;        }    });}