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
相关产品推荐
相关产品推荐

