6

I know that I can do something like this:

Preference pref = findPreference(getString(R.string.pref_vibrate_on_key));
pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

        @Override
        public boolean onPreferenceChange(Preference preference,
                Object newValue) {
            LogUtil.d("Working!");
            return true;
        }

});

But I would like to add a Listener to every preference. I tried doing:

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
sp.registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener() {

        @Override
        public void onSharedPreferenceChanged(
                SharedPreferences sharedPreferences, String key) {
            LogUtil.d("working!");

        }

});

but it doesn't work. Is this possible? If so, what am I doing wrong?

Macarse
  • 91,829
  • 44
  • 175
  • 230
  • [Here](http://stackoverflow.com/questions/2542938/sharedpreferences-onsharedpreferencechangelistener-not-being-called-consistently) is what you were doing wrong - right ? – Mr_and_Mrs_D Mar 30 '13 at 14:39

2 Answers2

8

Assuming you want the same listener called each time, this might be a simpler solution:

Preference.OnPreferenceChangeListener changeListener = new Preference.OnPreferenceChangeListener() {
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        // Code goes here            
        return true;
    }
};

EditTextPreference pref = (EditTextPreference)findPreference(getString(R.string.pref1));
pref1.setOnPreferenceChangeListener(changeListener);

EditTextPreference pref2 = (EditTextPreference)findPreference(getString(R.string.pref2));
pref2.setOnPreferenceChangeListener(changeListener);
bugfixr
  • 7,997
  • 18
  • 91
  • 144
1

I think that onSharedPrefererenceChanged is fired upon saving the preference (when you click BACK or HOME in PreferenceActivity). I think that the easiest way is to create single class implementing OnPreferenceChangeListener and switch through Preference.getKey(); and set it as OnPreferenceChangeListener for each Preference.

Jethro
  • 928
  • 1
  • 10
  • 20
skyman
  • 2,422
  • 17
  • 16
  • `onSharedPreferenceChanged` wont get called on BACK/HOME. (or even leaving the activity) – Yousha Aleayoub Mar 27 '16 at 15:10
  • http://developer.android.com/guide/topics/ui/settings.html#Listening describes this approach. @YoushaAleayoub are you shure that listener is still registered after launchig PreferenceActivity and that it is registered to same SharedPreferences? – skyman Mar 29 '16 at 13:02