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

Android SharedPreferences调用commit/apply/clear后无法保存问题求助

解决Android中Activity销毁时保存TextView内容并恢复的问题

看起来你已经找对方向了——用SharedPreferences来持久化TextView的内容是个很合适的方案,我帮你把代码补全并梳理清楚,确保能稳定运行:

首先,完善你写的SharedPreferences读写扩展函数,把读取的部分补全:

// 写入字符串到指定的SharedPreferences文件
fun MainActivity.putStringInPrefs(prefsFile: String, key: String, value: Any) =
    getSharedPreferences(prefsFile, Context.MODE_PRIVATE)
        .edit()
        .putString(key, value.toString())
        .apply()

// 从指定SharedPreferences文件读取字符串,支持设置默认值
fun MainActivity.getStringFromPrefs(prefsFile: String, key: String, defaultValue: String = ""): String =
    getSharedPreferences(prefsFile, Context.MODE_PRIVATE)
        .getString(key, defaultValue) ?: defaultValue

接下来,在Activity的生命周期方法里调用这两个函数:

保存TextView内容(建议在onPause/onStop中,比onDestroy更可靠)

override fun onPause() {
    super.onPause()
    // 替换成你的TextView实例和自定义的存储键名
    val userInputText = binding.tvUserInput.text.toString()
    putStringInPrefs("AppSettings", "saved_text_content", userInputText)
}

为什么推荐用onPause而不是只在onDestroy?因为当系统内存紧张时,Activity可能会被直接杀死,onDestroy不一定会被执行,在onPause中保存能最大程度避免数据丢失。当然你也可以同时在onDestroy中再存一次,双重保险。

恢复TextView内容(在onCreate中)

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)
    
    // 读取之前保存的内容,没有的话用空字符串作为默认值
    val savedText = getStringFromPrefs("AppSettings", "saved_text_content")
    binding.tvUserInput.text = savedText
}

最后给你几个小提示:

  • Context.MODE_PRIVATE是默认的私有模式,保证只有你的应用能访问这个配置文件,安全性没问题。
  • 如果你确定只会存字符串类型的内容,可以把putStringInPrefs的value参数改成String类型,避免非字符串转成String时出现奇怪的结果。
  • 记得替换代码里的tvUserInput为你实际的TextView的id,还有AppSettings和saved_text_content可以改成你自己习惯的文件名和键名,方便后续维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:43:26