android - OnPreferenceChangeListener 在进行更改之前触发

标签 android

对于下面的代码:

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/

相关文章:

java - 我正在为 android 创建登录和注册页面,但我使用的 sqlite 数据库在 onCreate 上崩溃

java - 找不到存储的图像

android - 如何在旋转屏幕后关闭 dialogfragment

android - 在 Android 中存储 Facebook 凭据以获取 Google Smart Lock 密码

java - ListView 背景

android - 如何在 android studio avd manager 中修复 "repair device"?

android - Corona SDK是否适合使用tableview导航的iOS/Android应用

android - 回收 View 仅显示 1 个元素

android - 此应用程序依赖于 Crashlytics。请在 https ://fabric. io/sign_up 注册访问

Android webview 应用程序和 Google Analytics