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

应用重启后无法获取SharedPreferences开关状态值,始终为默认false

解决SharedPreferences无法保存生物识别开关状态的问题

第一步:检查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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 21:35:05