首页 文章

Android sharedPreferences未使用commit / apply / clear保存

提问于
浏览
0

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

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

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 中返回默认值 . 我已经尝试了申请和提交,有和没有明确 . 没有结果 . 我究竟做错了什么 .

2 回答

  • 1

    super.onDestroy() 应该是重写方法 onDestroy() 中的最后一行 . 在执行"destructive"代码后执行的任何代码上,您可能会遇到意外行为

  • 1

    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"
    }
    

相关问题