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

Android(Kotlin)中SharedPreferences失效问题求助

解决EditText内容通过SharedPreferences持久化丢失的问题

你的问题出在依赖onDestroy()保存数据——Android系统并不保证onDestroy()方法一定会被执行。比如用户直接从最近任务列表划掉应用、系统后台回收进程时,onDestroy()可能根本没机会触发,导致输入的文本没写入SharedPreferences,再次打开就丢失了。

修复方案一:改用onPause()保存数据(推荐)

onPause()是Activity失去焦点时一定会触发的生命周期方法(比如切换应用、按Home键、关闭应用),用它来保存数据更可靠:

修改后的MainActivity.kt代码:

class MainActivity : AppCompatActivity() {
    lateinit var editText: EditText
    private val name = "MY_TEXT"
    private val key = "myStoredData"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        editText = findViewById(R.id.editTextText)
    }

    override fun onResume() {
        super.onResume()
        val sharedPref = getSharedPreferences(name, MODE_PRIVATE)
        // 如果没有保存的数据,默认显示空字符串,也可以改成"Name"
        val myValue = sharedPref.getString(key, "")
        editText.setText(myValue)
    }

    override fun onPause() {
        super.onPause()
        val sharedPref = getSharedPreferences(name, MODE_PRIVATE)
        sharedPref.edit()
            .putString(key, editText.text.toString())
            .apply()
    }
}

修复方案二:实时保存输入内容

如果希望完全避免任何意外丢失,可以给EditText添加文本变化监听器,用户每输入一个字符就自动保存:

class MainActivity : AppCompatActivity() {
    lateinit var editText: EditText
    private val name = "MY_TEXT"
    private val key = "myStoredData"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        editText = findViewById(R.id.editTextText)

        val sharedPref = getSharedPreferences(name, MODE_PRIVATE)
        // 恢复已保存的数据
        val savedText = sharedPref.getString(key, "Name")
        editText.setText(savedText)

        // 实时监听文本变化并保存
        editText.addTextChangedListener(object : TextWatcher {
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}

            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                sharedPref.edit()
                    .putString(key, s.toString())
                    .apply()
            }

            override fun afterTextChanged(s: Editable?) {}
        })
    }
}

额外注意点

你的布局中EditText设置了android:text="Name",如果希望首次打开显示这个默认值,之后保存用户输入的内容,要确保代码中恢复数据时的默认值设为"Name"(如方案二所示),或者去掉布局里的android:text属性,完全由代码控制显示内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 17:02:37