Android Kotlin从Utils类启动活动会导致SavedInstanceState为Null

Android Kotlin从Utils类启动活动会导致SavedInstanceState为Null,android,kotlin,android-intent,android-activity,Android,Kotlin,Android Intent,Android Activity,为了事先澄清一下,我已经在SO中广泛搜索了类似的问题,以找到我问题的答案 我将参考以下(列举一些来源): 我有一个主要活动和四个其他不同的活动,让我们称它们为a到D 我还有一个Utilities类,它设置从活动a到D中的click listeners到图像按钮 这些侦听器然后打开一个新的活动,即 出于某种原因,在活动E的onCreate方法中,savedInstanceState始终为空。 我曾尝试从MainActivity设置侦听器,但没有效果。 我还从MainActivity传递了

为了事先澄清一下,我已经在SO中广泛搜索了类似的问题,以找到我问题的答案

我将参考以下(列举一些来源):

我有一个主要活动和四个其他不同的活动,让我们称它们为a到D

我还有一个Utilities类,它设置从活动a到D中的click listeners到图像按钮

这些侦听器然后打开一个新的活动,即

出于某种原因,在活动E的
onCreate
方法中,
savedInstanceState
始终为空。 我曾尝试从MainActivity设置侦听器,但没有效果。 我还从MainActivity传递了上下文(而不是使用滚动视图),但这也没有效果

下面是一段代码

实用程序.kt

class Utilities {

companion object {
    /...

    fun setTooltipsAndListeners(scrollView: ScrollView) {
        val buttons: ArrayList<View> = scrollView.touchables
        for (button in buttons) {
            val tooltipText = button.contentDescription
            if (tooltipText != null) {
                TooltipCompat.setTooltipText(button, tooltipText)
            }

            button.setOnClickListener(object : View.OnClickListener {
                override fun onClick(v: View?) {

                    val tag: String? = v?.tag as? String
                    val intent = Intent(scrollView.context, ActivityE::class.java)
                    intent.putExtra("symbol_name", tooltipText)
                    intent.putExtra("symbol_image", tag)

                    scrollView.context.startActivity(intent)

                }
            })

        }
    }

   /...
}
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.layout_name)
    setDataToUI(savedInstanceState)
}

private fun setDataToUI(savedInstanceState: Bundle?) {

    if (savedInstanceState == null) {
        Log.d("TAG", "savedInstanceState IS NULL")
        return
    }

  /... Inner logic that is not relevant
}

您需要使用
getIntent()
而不是
savedInstanceState
。因此,您的代码将如下更改:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.layout_name)
    setDataToUI(intent)
}

private fun setDataToUI(intent: Intent?) {

    if (intent.getStringExtra("symbol_name") == null) {
        Log.d("TAG", "No data passed for symbol_name")
        return
    }
    // Do the same for other strings. Or alternatively, you can pass Bundle 
    // data from your Utility and retrieve the bundle through the intent as well
}
savedInstanceState
用于在活动状态更改时存储数据,但您正在通过实用程序类中的
Intent
传递数据