【问题标题】:Android sharedPreferences not saving with commit/apply/clearAndroid sharedPreferences 不使用提交/应用/清除保存
【发布时间】:2018-08-30 21:48:50
【问题描述】:

我试图在我的应用关闭时保存 TextView 的文本内容,因此我试图将该信息保存在 onDestroy 方法中,然后将它们设置在 onCreate 方法中。

我编写了以下 2 个函数来摆脱在共享首选项中获取和放置值的样板:

fun MainActivity.putStringInPrefs(prefsFile: String, key: String, value: Any) =
    getSharedPreferences(prefsFile, Context.MODE_PRIVATE)
            .edit()
            .putString(key, value.toString())
            .apply()

fun MainActivity.getStringFromPrefs(prefsFile: String, key: String, default: Any = "") : String =
    getSharedPreferences(prefsFile, Context.MODE_PRIVATE).getString(key, default.toString())

当应用关闭时,这就是所谓的:

override fun onDestroy() { 
        super.onDestroy()
        log("OnDestroy!")
        putStringInPrefs(mainPrefsFile, "lastSelectedItemDescription", textViewItemDetailsTextView.text) }

log 只是Log.d("", "string") 的包装

onCreate 中,它被调用:

 override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState) ; log("OnCreate!")
            setContentView(R.layout.activity_main)

            // Set up the item details text view
            textViewItemDetailsTextView.text = getStringFromPrefs(mainPrefsFile, "lastSelectedItemDescription", detailsText)

问题是无论我做什么,首选项都不会保存,默认值总是在onCreate 中返回。无论有无明确,我都尝试过申请和提交。没有结果。我做错了什么。

【问题讨论】:

  • 不是您的问题的直接答案,但您可以考虑使用新的 Android KTX,它是共享偏好“包装器”(github.com/android/android-ktx)
  • @JohnO'Reilly 谢谢!这似乎很有用,但我才开始玩 android,所以我想先弄脏我的手,然后再把它抽象出来以适应事物的方式。但是,非常感谢!
  • 你应该通过不使用扩展函数来简化你的代码,而是直接在你的Activity中实现方法putStringInPrefs getStringFromPrefs 。您还可以删除 prefsFile 参数并将其替换为字符串常量,因为您将始终从同一个地方读取和写入您的密钥,以避免混淆

标签: java android serialization kotlin sharedpreferences


【解决方案1】:

super.onDestroy() 应该是覆盖方法onDestroy() 的最后一行。在执行“破坏性”代码后,您可能会在执行的任何代码上遇到意外行为

【讨论】:

  • 你确定你要求的是同一个“prefsFile”吗?
  • 是的。 mainPrefsFile实际上是MainActivity的成员,它在开始时被初始化(在onCreate之外,是类本身的成员)val mainPrefsFile: String = "main_prefs"
【解决方案2】:

onDestroy() 中保存Activity 状态不是一个好主意,因为系统可能会在不调用活动的最终onDestroy() 回调的情况下终止托管您的活动的进程。 (see docs)。

要保存状态,您可以改用onSaveInstanceState / onRestoreInstanceState。见:Saving and restoring activity state

override fun onSaveInstanceState(outState: Bundle?) {
    outState?.putString(YOUR_TEXT, textView.text)
    super.onSaveInstanceState(outState)
}

override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
    super.onRestoreInstanceState(savedInstanceState)
    if (savedInstanceState != null) {
        textView.text = savedInstanceState.getString(YOUR_TEXT)
    }
}

companion object {
    val YOUR_TEXT = "your_text"
}

【讨论】:

    猜你喜欢
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 2014-06-22
    • 2012-04-15
    相关资源
    最近更新 更多