Android(Kotlin)中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
相关产品推荐
相关产品推荐

