应用重启后无法获取SharedPreferences开关状态值,始终为默认false
第一步:检查SharedPreferences工具类实现
其他值(如token)能正常保存,说明工具类整体逻辑无问题,但boolean类型的读写可能存在bug,重点排查以下两点:
- getPrefBoolean方法:确认默认值是否正确传递,避免硬编码默认值
false覆盖传入参数。正确实现示例:
fun getPrefBoolean(context: Context, key: String, defaultValue: Boolean = false): Boolean { val sp = context.getSharedPreferences("your_sp_name", Context.MODE_PRIVATE) return sp.getBoolean(key, defaultValue) }
- setPrefBoolean方法:确认是否调用
apply()或commit()提交修改,未提交的修改不会持久化。正确实现示例:
fun setPrefBoolean(context: Context, key: String, value: Boolean) { val sp = context.getSharedPreferences("your_sp_name", Context.MODE_PRIVATE) val editor = sp.edit() editor.putBoolean(key, value) editor.apply() // 异步提交更推荐,commit为同步提交 }
第二步:简化冗余逻辑
onNavigationItemSelected中手动切换开关后重复调用setPrefBoolean,会和开关的OnToggledListener触发重复操作,建议简化代码:
override fun onNavigationItemSelected(item: MenuItem): Boolean { when (item.itemId) { R.id.nav_biometric -> { // 仅切换开关状态,由监听事件统一处理保存逻辑 toggle_biometric.isOn = !toggle_biometric.isOn } } drawerLayout.closeDrawer(GravityCompat.START) return true }
开关的OnToggledListener会自动完成pref保存和biometricLogin变量更新,无需重复编码。
第三步:统一上下文使用
虽然SharedPreferences按包名共享,上下文不影响最终存储,但读写时统一使用相同上下文可避免潜在问题,比如onResume中修改为:
override fun onResume() { super.onResume() toggle_biometric.isOn = pref.getPrefBoolean(this@HomeActivity, pref.biometric_enable) }
第四步:验证键名一致性
确认pref.biometric_enable键名在读写操作中完全一致,避免大小写、拼写错误导致的存储/读取不匹配。
完成以上步骤后重启应用测试,开关状态的保存与恢复功能即可正常工作。
内容的提问来源于stack exchange,提问作者Hamid Akhtar
相关产品推荐
相关产品推荐

