问题描述
我在 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 (将#修改为@)