代码添加的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中已存储的(或默认冲突的)值覆盖。 - 具体修正步骤:
- 给每个SwitchPreference分配唯一key,循环时通过索引区分:
switchPreference.setKey(key + "_" + i); - 调整方法调用顺序:先设置默认值,再设置勾选状态,或者直接依赖
setDefaultValue(true)初始化(Preference会优先读取SharedPreferences中的值,无存储值时使用默认值)。如果需要强制初始勾选,可先清除对应key的存储数据,或确保首次运行时该key无历史存储。 - 添加Preference后,调用
preferenceGroup.notifyChanged()通知界面更新状态。
- 给每个SwitchPreference分配唯一key,循环时通过索引区分:
另外,若之前测试时已用相同key存储过false状态,需先清除App的存储数据再测试修改后的代码,避免历史值影响。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

