You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

代码添加的SwitchPreference始终未勾选,求解决方法

问题:动态添加的SwitchPreference无法保持勾选状态

我通过编程方式在PreferenceCategory中添加3个SwitchPreference,对应的XML布局代码如下:

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

    <PreferenceCategory
        android:key="my_key"
        android:title="TEST" />
</PreferenceScreen>

添加SwitchPreference的代码如下:

PreferenceGroup preferenceGroup = (PreferenceGroup) findPreference("my_key");
for (int i = 0; i < 3; i++) {
    SwitchPreference switchPreference = new SwitchPreference(getActivity());
    switchPreference.setTitle(title);
    switchPreference.setKey(key);
    switchPreference.setDefaultValue(true);
    switchPreference.setChecked(true);

    preferenceGroup.addPreference(switchPreference);
}

运行后所有SwitchPreference均显示为未勾选状态。

解决方法

  • 核心问题:所有SwitchPreference使用了相同的key,导致Preference框架在持久化状态时互相覆盖;同时setChecked(true)会被SharedPreferences中已存储的(或默认冲突的)值覆盖。
  • 具体修正步骤:
    1. 给每个SwitchPreference分配唯一key,循环时通过索引区分:
      switchPreference.setKey(key + "_" + i);
      
    2. 调整方法调用顺序:先设置默认值,再设置勾选状态,或者直接依赖setDefaultValue(true)初始化(Preference会优先读取SharedPreferences中的值,无存储值时使用默认值)。如果需要强制初始勾选,可先清除对应key的存储数据,或确保首次运行时该key无历史存储。
    3. 添加Preference后,调用preferenceGroup.notifyChanged()通知界面更新状态。

另外,若之前测试时已用相同key存储过false状态,需先清除App的存储数据再测试修改后的代码,避免历史值影响。

内容的提问来源于stack exchange,提问作者Eric

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 15:25:19