onSharedPreferenceChanged not fired all the time

浪尽此生 提交于 2019-12-10 09:26:55

问题


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>


回答1:


Move unregisterOnSharedPreferenceChangeListener from onPause() to onStop().




回答2:


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.



来源:https://stackoverflow.com/questions/16709359/onsharedpreferencechanged-not-fired-all-the-time

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!