Garro88
Garro88

Reputation: 360

onSharedPreferenceChanged not fired all the time

I have a weird problem with this method. It's called, when i edit a EditTextPreference, only when i change the value, and on a MultiSelectListPreference only the first time i change. This is my fragment code.

public class PrefFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
        addPreferencesFromResource(R.xml.my_preferences);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        // DO STUFF
    }

    @Override
    public boolean onPreferenceTreeClick(final PreferenceScreen preferenceScreen, final Preference preference) {
        // TODO Auto-generated method stub
        super.onPreferenceTreeClick(preferenceScreen, preference);
        // DO STUFF

    }

    @Override
    public void onResume() {
        super.onResume();
        // Set up a listener whenever a key changes
        getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onPause() {
        super.onPause();
        // Unregister the listener whenever a key changes
        getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
    }
}

and this is my_preferences.xml file

<PreferenceCategory android:title="Title1" > <EditTextPreference android:dialogMessage="@string/pref_pers_1_msg" android:dialogTitle="@string/pref_pers_1" android:key="@string/pref_pers_1_key" android:title="@string/pref_pers_1" /> <EditTextPreference android:dialogMessage="@string/pref_pers_2_msg" android:dialogTitle="@string/pref_pers_2" android:key="@string/pref_pers_2_key" android:title="@string/pref_pers_2" /> <EditTextPreference android:dialogMessage="@string/pref_pers_3_msg" android:dialogTitle="@string/pref_pers_3" android:key="@string/pref_pers_3_key" android:title="@string/pref_pers_3" /> </PreferenceCategory> <PreferenceCategory android:title="Title2" > <MultiSelectListPreference android:dialogTitle="title_dialog" android:entries="@array/array" android:entryValues="@array/array_elements" android:key="pref_pers_4" android:title="Title2" /> </PreferenceCategory>

Upvotes: 4

Views: 983

Answers (2)

Move unregisterOnSharedPreferenceChangeListener from onPause() to onStop().

Upvotes: 0

Nelson Almendra
Nelson Almendra

Reputation: 881

Probably it's because the onPause() callback is called and the unregisterOnSharedPreferenceChangeListener is called.

Place Logs on both methods onResume() and onPause() to make sure that when you click, the unregister method didn't ran.

Upvotes: -1

Related Questions