如何将数据从 onCreate() 传递到 onSaveInstanceState()?

Posted

技术标签:

【中文标题】如何将数据从 onCreate() 传递到 onSaveInstanceState()?【英文标题】:How to pass data from onCreate() to onSaveInstanceState()? 【发布时间】:2020-12-06 04:09:33 【问题描述】:

我的主活动中有一个 onCreate() 函数和一个 onSaveInstanceState() 函数。我在 onCreate() 中声明了一个 Map,我想在我的 onSaveInstanceState() 函数中访问该 Map 的键,以便将它们保存到 outState 包中。

class MainActivity: AppCombatActivity()

     override fun onSaveInstanceState(outState: Bundle) 
        super.onSaveInstanceState(outState)
        //Want to access the iconMap here, but it is outside of the Map's scope. How do I access it?
    

     override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val iconMap = mapOf("contactlessIcon" to getDrawable(R.drawable.ic_contactless_24px), "fingerprintIcon" to getDrawable(R.drawable.ic_fingerprint_black_48dp), "codeIcon" to getDrawable(R.drawable.ic_code_24px))
    

我对 android 编程相当陌生,所以这可能是一个简单的解决方法。我想访问 onSaveInstanceState() 中的iconMap,但它在iconMap's 范围之外。我不能将 iconMap 设为全局变量,因为这会使我的应用程序崩溃。

【问题讨论】:

您在onSaveInstanceState() 中保存了哪些iconMap?通常,您应该保存的唯一内容是用户的状态,而不是始终相同的字符串或 Drawable。 【参考方案1】:

正如@ianhanniballake 评论的那样——你不应该保存总是相同的 Drawable。在这种情况下,这是特别没有必要的,因为您的 onCreate 将在活动恢复时再次被调用。

但是,要回答您的问题,您可以这样做:

class MainActivity: AppCombatActivity()
      // define it here, so it's a member of the class
      lateinit val iconMap: Map<String, Drawable>

      override fun onSaveInstanceState(outState: Bundle) 
        super.onSaveInstanceState(outState)
        //now you can use it here
      

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
 
        //set its value
        iconMap = mapOf("contactlessIcon" to getDrawable(R.drawable.ic_contactless_24px), "fingerprintIcon" to getDrawable(R.drawable.ic_fingerprint_black_48dp), "codeIcon" to getDrawable(R.drawable.ic_code_24px))
     

【讨论】:

以上是关于如何将数据从 onCreate() 传递到 onSaveInstanceState()?的主要内容,如果未能解决你的问题,请参考以下文章

将变量从方法传递到onCreate方法中的另一个变量

将数据从内部视图传递到活动

如何将数据从刀片传递到刀片文件

无法将数据从 asyncTask 传递到我的活动

从活动接收意图后如何创建片段?

如何将多个值从模板传递到模板?