Reputation: 143
I'm trying to launch a date picker fragment when the user click on the preference item and display the selected date in the summary.
However, the OnPreferenceChangeListener is not called when the preference value changed. I verified that the value did change.
Am I doing it wrong?
Here is the SettingsFragment
// Configure setting start date
Preference startDatePref = findPreference(getString(R.string.pref_start_date));
startDatePref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
DialogFragment startFragment = DatePickerFragment.newInstance(DatePickerFragment.PICK_START);
startFragment.show(((AppCompatActivity) getActivity()).getSupportFragmentManager(), "Pick Start Date of Semester");
return true;
}
});
// Update the summary when date is picked
startDatePref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
preference.setSummary(newValue.toString());
Log.d("pref change", "called!");
return true;
}
});
DatePicker
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
SharedPreferences pref = getActivity().getSharedPreferences(
getActivity().getString(R.string.date_info_file), Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = pref.edit();
if (mType == PICK_START) {
editor.putInt(getString(R.string.start_date_year), year);
editor.putInt(getString(R.string.start_date_month), monthOfYear);
editor.putInt(getString(R.string.start_date_day), dayOfMonth);
UniData.setDataStatus(getActivity(), UniData.START_DATE, true);
// Change the preference used in preferences.xml so that the onChange listener will be called
SharedPreferences defaultPref = PreferenceManager.getDefaultSharedPreferences(getContext());
SharedPreferences.Editor editDefault = defaultPref.edit();
editDefault.putString(getString(R.string.pref_start_date), year + "-" + (monthOfYear + 1) + "-" + dayOfMonth);
editDefault.commit();
Log.d(LOG_TAG, "Start Picked: " + year + " " + monthOfYear + " " + dayOfMonth);
}
...
editor.commit();
preferences.xml
<PreferenceCategory
android:key="pref_key_schedule_settings"
android:title="Schedule">
<Preference
android:defaultValue=""
android:key="pref_start_date"
android:summary="For the app to determine odd and even week."
android:title="Set start date of semester"/>
</PreferenceCategory>
Upvotes: 1
Views: 1146
Reputation: 55
I had a similar problem and solved it by calling callChangeListener(myNewValue);
in my custom Preference such as:
@Override
protected void onDialogClosed(boolean positiveResult) {
super.onDialogClosed(positiveResult);
if (positiveResult && mSelectedDate != null) {
persistDate(mSelectedDate);
callChangeListener(mSelectedDate);
}
}
Hope this helps
Upvotes: 2