Android 共享首选项、Kotlin

Android shared preference, Kotlin

提问人:Peter Horvath 提问时间:12/30/2022 更新时间:12/30/2022 访问量:205

问:

我有以下简单的代码。它采用文本框的值,保存并检索。 检索到的值与保存的值不同。

打印输出: 值:qwert 阿斯达夫

可能是什么问题?

val sharedPref = getSharedPreferences("Data", Context.MODE_PRIVATE)
sharedPref.edit().putString("Str",binding.text.editText?.text.toString())
print("Value: ")
println(binding.text.editText?.text.toString())
sharedPref.edit().commit()
println(sharedPref.getString("Str","asdf"))

感谢您提前提供任何提示

Android Kotlin 共享首选项

评论


答:

2赞 Some random IT boy 12/30/2022 #1

SharedPreferences#edit将一个类的实例交给您,您正在该类上调用该方法,但您没有在该实例上提交任何更改。SharedPreferences.EditorputString

你的第二个只是得到一个没有任何版本的新实例,并且调用没有任何变化。sharedPref.edit().commit()SharedPreferences.Editorcommit

请尝试以下操作

val editor = sharedPrefs.editor()

editor.putString("key", "value")
editor.commit()

return sharedPrefs.getString("key", "defaultValue")

一种更惯用的方法是使用 kotlin stdlib 中的函数:apply

sharedPrefs.edit().apply {
  putString("key", "value")
  commit()
}

评论

0赞 MichiBros 12/30/2022
此外,由于 apply() 是异步的,它可能不会立即显示保存的值。但我怀疑这会成为实际应用程序实现的问题。
0赞 Some random IT boy 12/30/2022
我的意思是来自 kotlin 的 stdlib,但你是对的。您可以使用(异步)或同步来保存更改。提出来的好点applySharedPreferences.Editor#applySharedPreferences.Editor#commit
1赞 Tenfour04 12/30/2022
@MichiBros,apply() 在 SharedPreferences 的内存实例上是同步的,因此该值肯定可以立即使用,但在 apply() 返回时不一定会写入磁盘。
0赞 jcredking 12/30/2022 #2

你也可以像这样试试

//For Add String Value in sharedPreferences
    val sharedPreferences = getSharedPreferences("key", MODE_PRIVATE) ?: return
    with(sharedPreferences.edit()) {
        putString("yourStringKey", "Hello World")
        apply()
    }
    
//Here get enter string value from sharedPreferences other activity 
    val sharedPreferences1 = getSharedPreferences("key", MODE_PRIVATE) ?: return
    val string = sharedPreferences1.getString("yourStringKey", "hi") //"hi" is default value
    Log.e("sharedPreferences1", "sharedPreferences1 Val is -->> $string")

有关更多信息,您可以在此处参考官方 android 文档