2

我有一个 SwitchPreference 显示 AlertDialog onChange 并希望根据在 AlertDialog 中单击的按钮(正/负)来接受/拒绝更改。

如果用户尝试将值更改为“true”,则应接受更改,否则应显示 AlertDialog 并拒绝 SwitchPreference 更改。只有当用户确认 AlertDialog(肯定按钮)时,才应更改 SwitchPreference。

下面是扩展 PreferenceActivity 的我的 Activity 类的相关部分。SharedPreferences 中的值实际上已按预期更新,只是 SwitchPreference 没有明显更改(开关保持选中状态)-我必须重新打开 SettingsActivity 才能看到更改(未选中开关)。

final SwitchPreference passwordEnabled = (SwitchPreference) findPreference(PASSWORD_ENABLED);
passwordEnabled.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
    @Override
    public boolean onPreferenceChange(final Preference preference, Object newValue) {
        final Context c = getActivity();
        if ((boolean) newValue) {
            return true;
        }

        new AlertDialog.Builder(c)
                // omitting non-relevant code
                .setPositiveButton(getString(R.string.confirm), new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        ((SwitchPreference) preference).setChecked(false);
                        preference
                                .getEditor()
                                .putBoolean(PASSWORD_ENABLED, false)
                                .commit();
                        preference.setSummary(R.string.disabled);
                    }
                })
                .setNegativeButton(getString(R.string.cancel), null)
                .create().show();
        return false;
    }
});
4

1 回答 1

1

将此方法添加到包含上述代码的类中。

static void updateUI() {
    if(mSharedPreferences.getInt(mSharedPrefKey,0) == 0){
        Log.d(TAG,"Shared preference stored 0");
        mBtHciSnoopLogServer.setChecked(false);
    }
}

在您更改开关首选项的位置调用该方法:

  mSharedPreferences.edit().putInt(mSharedPrefKey, 0).commit();
  YourClass.updateUI();

由于该方法是静态的,因此它存储在全局内容中,因此一切正常。

于 2016-11-10T08:15:14.377 回答