SwitchPreference 以编程方式创建,setChecked 不起作用

SwitchPreference create programmatically, setChecked not working

我要

  1. 以编程方式创建 SwitchPreference
  2. 设置setChecked(true)就可以了
  3. 将其添加到 PreferenceGroup

1 和 3 工作正常,但在 3 之后 SwitchPreference 未选中并且点击切换无效(不能 'turned on'/ 选中)。

这是我的 PreferenceFragment

public class MyPrefFragment extends PreferenceFragment {
    @Override
    public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {

        addPreferencesFromResource(R.xml.prefs);

        PreferenceGroup preferenceGroup = (PreferenceGroup) findPreference("pref_cat_1");

        SwitchPreference switchPreference = new SwitchPreference(getActivity());
        switchPreference.setTitle("new");
        switchPreference.setChecked(true);
        switchPreference.setDefaultValue(true);

        switchPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(final Preference preference, final Object newValue) {

                Toast.makeText(getActivity(), newValue.toString(), Toast.LENGTH_SHORT).show();

                return false;
            }
        });

        preferenceGroup.addPreference(switchPreference);

    }
}

和我的 PreferenceScreen

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <PreferenceCategory android:title="cat_one">

        <SwitchPreference
            android:key="pref_1"
            android:defaultValue="false"
            android:title="fest"/>

    </PreferenceCategory>

    <PreferenceCategory
        android:key="pref_cat_1"
        android:title="category"/>

</PreferenceScreen>

如何正确地 setChecked(true) 以编程方式创建的 SwitchPreference?

测试项目为on Github.

The SwitchPreference is not checked and clicks on the toggle have no effect.

在我的机器上检查过。关于点击后的状态,你是完全正确的。那是因为你从 onPreferenceChange() 回调返回 false

onPreferenceChange() 的文档:

Returns: true to update the state of the Preference with the new value.

所以,我只将 false 更改为 true,它按预期工作。

编辑

我是运行API25平板模拟器。然后 运行 在 API 22 模拟器上,它没有工作。非常 st运行ge,它仅在 API 25.

上按预期运行

我在使用 addPreference() 时遇到了同样的问题,但我切换到 preferenceGroup.addItemFromInflater(switchPreference) 并且效果很好。