对于下面的代码:
final SwitchPreference sp = (SwitchPreference) findPreference(getString(R.string.pref_key_reminder));
sp.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object o) {
AlarmReceiver.scheduleAlarm(getActivity());
return true;
}
});
我需要switch preference的改变值,但是preferance
中的值是改变前的值。对象 o
具有新值,但如何在调用 AlarmReceiver.scheduleAlarm
之前在首选项中设置它。该方法使用首选项的值。
最佳答案
你是对的,SwitchPreference
更改了底层 SharedPreferences
值之后 Preference.OnPreferenceChangeListener.onPreferenceChange
是调用,请参阅 SwitchPreference
中的代码:
private class Listener implements CompoundButton.OnCheckedChangeListener {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (!callChangeListener(isChecked)) { // callback here
// Listener didn't like it, change it back.
// CompoundButton will make sure we don't recurse.
buttonView.setChecked(!isChecked);
return;
}
SwitchPreference.this.setChecked(isChecked); // save value here
}
}
/**
* Sets the checked state and saves it to the {@link SharedPreferences}.
*
* @param checked The checked state.
*/
public void setChecked(boolean checked) {
// Always persist/notify the first time; don't assume the field's default of false.
final boolean changed = mChecked != checked;
if (changed || !mCheckedSet) {
mChecked = checked;
mCheckedSet = true;
persistBoolean(checked);
if (changed) {
notifyDependencyChange(shouldDisableDependents());
notifyChanged();
}
}
}
然后当你打电话时:
AlarmReceiver.scheduleAlarm(getActivity());
并从 SharedPreferences
中检索值,您将获得旧值。因此,您可以推迟对 AlarmReceiver.scheduleAlarm
的调用,例如,使用 Handler
:
handler.post(new Runnable() {
AlarmReceiver.scheduleAlarm(getActivity());
});
关于android - OnPreferenceChangeListener 在进行更改之前触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51256723/