Android 在方向更改时崩溃

问题描述

我在 android.widget.Spinner 中有一个 androidx.fragment.app.Fragment。微调器的项目是动态的,并在运行时计算。

override fun onCreateView(
    inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
): View? {
    val act = activity
    val rootView = inflater.inflate(R.layout.my_fragment,container,false)
    val arrLimits = arrayOf("blah" as String?)

    if (act != null) {
        val spinner = rootView.findViewById<Spinner>(R.id.my_spinner)
        spinner?.adapter = ResUtils.createArrayAdapter(arrLimits,act)

        spinner?.onItemSelectedListener = object: OnItemSelectedListener {
            override fun onItemSelected(
                parent: AdapterView<*>?,view: View,position: Int,id: Long
            ) {
                Log.d(LOG_CHANNEL,"item selected")
            }

            override fun onnothingSelected(parent: AdapterView<*>?) {}
        }
    }

    return rootView
}

这最初有效,但一旦方向改变,应用就会崩溃。

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapp,PID: 7309
java.lang.NullPointerException: Parameter specified as non-null is null: 
    method kotlin.jvm.internal.Intrinsics.checkNotNullParameter,parameter view at com.example.myapp.fragment.MyFragment$onCreateView$1.onItemSelected

即使异常看起来像是在 onItemSelected 内部崩溃,Log.d 也从未被调用。但是,如果我注释掉 onItemSelectedListener,应用不会在方向改变时崩溃。

经过数小时的调试后,我开始怀疑 Android 试图使用不再存在或尚不存在的值来恢复片段的微调器的状态。为了验证这一点,我尝试在片段中添加以下几行:

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.clear()
}

override fun onViewStateRestored(savedInstanceState: Bundle?) {
    super.onViewStateRestored(savedInstanceState)
    savedInstanceState?.clear()
}

以及活动的以下内容

override fun onSaveInstanceState(outState: Bundle,outPersistentState: PersistableBundle) {
    super.onSaveInstanceState(outState,outPersistentState)
    outState.clear()
}

但应用程序仍然崩溃。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)