Android PreferenceScreen onChangeListener not invoked

android, events, preferencescreen

Solution

I had the same problem. I tried to set up a onPreferenceChangeListener but that was wrong. What I really needed was an onSharedPreferenceListener.

OnSharedPreferenceChangeListener listener;

Write this in the onCreate() of your Preference activity:

listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
        // Here you can work.
        // IMPORTANT:  Beware that at this point the preference has already been changed!
    }
};

SharedPreferences prefs = getSharedPreferences(getPackageName() + "_preferences", MODE_PRIVATE);
prefs.registerOnSharedPreferenceChangeListener(listener);

Problem

i wrote a simple PreferenceScreen, looks as follows: ``` public class SettingsActivity extends PreferenceActivity implements OnPreferenceChangeListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.settings); PreferenceScreen prefScreen = getPreferenceScreen(); prefScreen.setOnPreferenceChangeListener(this); } @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { if (preference.getTitle().equals(getString(R.string.settings_diverse_about))) { // TODO open about dialog } return super.onPreferenceTreeClick(preferenceScreen, preference); } private static String PATTERN_EMAIL = "[A-Z0-9._%-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}"; private static String PATTERN_TWITTER = "[a-zA-Z0-9_-]+"; @Override public boolean onPreferenceChange(Preference preference, Object newValue) { String prefTitle = preference.getTitle().toString(); // phone will be fully handled by inputType String newStr = newValue.toString(); if (prefTitle.equals(getString(R.string.settings_contact_email))) { return newStr.trim().matches(PATTERN_EMAIL); } else if (prefTitle.equals(getString(R.string.settings_contact_twitter))) { return newStr.trim().matches(PATTERN_TWITTER); } return true; } ``` The problem is, the onPreferenceChange method gets never invoked. Furthermore, what do you think about the way of validating the attributes? I think it's not really optimal. ``` preference.getTitle().equals(getString(R.string.settings_diverse_about)) ```

Original source