如何使用SharedPreferences保存互斥Switch状态?故障排查求助
我来帮你搞定这个互斥Switch的状态保存问题!核心要抓住两点:一是保证两个Switch始终互斥,二是把状态正确写入/读取SharedPreferences。下面是具体的实现步骤和修正后的代码:
关键逻辑梳理
- 互斥控制:当任意一个Switch被勾选为
true时,立刻把另一个Switch设为false - 状态持久化:每次状态变化时,同步把两个Switch的状态写入SharedPreferences
- 状态恢复:在Activity启动时,从SharedPreferences读取保存的状态,回显到Switch上(首次启动可以设置默认值)
修正后的完整代码
public class StartingActivity extends AppCompatActivity { private Switch hourly, salary; private SharedPreferences pref; private SharedPreferences.Editor editor; private static final String TAG = "StartingActivity"; // 定义SharedPreferences的键名,方便统一管理 private static final String KEY_HOURLY_SWITCH = "hourly_switch_state"; private static final String KEY_SALARY_SWITCH = "salary_switch_state"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_layout_name); // 替换成你的布局文件名 // 初始化SharedPreferences pref = getSharedPreferences("SwitchStatePref", MODE_PRIVATE); editor = pref.edit(); // 绑定Switch控件 hourly = findViewById(R.id.hourly_switch); // 替换成你的hourly Switch的id salary = findViewById(R.id.salary_switch); // 替换成你的salary Switch的id // 恢复之前保存的状态,默认hourly为true(可根据需求调整) boolean isHourlyChecked = pref.getBoolean(KEY_HOURLY_SWITCH, true); boolean isSalaryChecked = pref.getBoolean(KEY_SALARY_SWITCH, false); hourly.setChecked(isHourlyChecked); salary.setChecked(isSalaryChecked); // 设置hourly Switch的监听 hourly.setOnCheckedChangeListener((buttonView, isChecked) -> { if (isChecked) { // 选中hourly时,把salary设为未选中 salary.setChecked(false); // 保存状态到SharedPreferences editor.putBoolean(KEY_HOURLY_SWITCH, true); editor.putBoolean(KEY_SALARY_SWITCH, false); editor.apply(); } else { // 如果要禁止两个都未选中的情况,可以在这里强制设置salary为true // salary.setChecked(true); // editor.putBoolean(KEY_HOURLY_SWITCH, false); // editor.putBoolean(KEY_SALARY_SWITCH, true); // editor.apply(); } }); // 设置salary Switch的监听 salary.setOnCheckedChangeListener((buttonView, isChecked) -> { if (isChecked) { // 选中salary时,把hourly设为未选中 hourly.setChecked(false); // 保存状态到SharedPreferences editor.putBoolean(KEY_HOURLY_SWITCH, false); editor.putBoolean(KEY_SALARY_SWITCH, true); editor.apply(); } else { // 同样,禁止两个都未选中的话,强制设置hourly为true // hourly.setChecked(true); // editor.putBoolean(KEY_HOURLY_SWITCH, true); // editor.putBoolean(KEY_SALARY_SWITCH, false); // editor.apply(); } }); } }
注意事项
- 记得替换代码中的布局文件名和Switch控件id,对应你自己的布局文件
- 如果需要禁止两个Switch都处于未选中状态,可以把监听里注释的代码打开,这样用户取消一个时,另一个会自动选中
- 使用
editor.apply()而不是commit(),因为apply()是异步提交,不会阻塞主线程,性能更好
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

