Android Kotlin Запуск действия из класса Utils приводит к тому, что SavedInstanceState имеет значение Null - PullRequest
0 голосов
/ 31 января 2020

Просто чтобы прояснить заранее, я много раз искал в SO похожий вопрос, чтобы найти ответ на свой вопрос.

Я буду ссылаться на следующее (чтобы назвать несколько источников):

У меня есть MainActivity и четыре других различных вида деятельности, назовем их от A до D.

У меня также есть класс Utilities, который устанавливает для слушателей щелчка кнопки изображений, найденные в действиях от A до D.

Затем эти слушатели открывают новое действие, E.

По некоторым причинам, в методе onCreate для действия E savedInstanceState всегда равно нулю. Я попытался настроить слушателя из MainActivity, но безрезультатно. Я также передал контекст из MainActivity (вместо использования представления прокрутки), но это также не оказало влияния

Ниже приведен фрагмент кода.

Utilities.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)

                }
            })

        }
    }

   /...
}

ActivityE.kt

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
}

1 Ответ

0 голосов
/ 31 января 2020

Вместо savedInstanceState вам нужно использовать getIntent(). Так что ваш код изменится так:

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 в своем служебном классе

...