Spinner的onItemSelectedListener在返回Fragment时触发空指针崩溃问题
解决Spinner在Fragment返回时的NullPointerException问题
你遇到的崩溃问题核心原因很明确:Fragment切换返回后,Spinner触发onItemSelected回调时传入了null的view参数,但你在Kotlin代码里把这个参数声明成了非空类型View,Kotlin内置的非空检查机制Intrinsics.checkNotNullParameter会直接抛出NullPointerException。
问题根源
在Android的Fragment生命周期场景下(比如Fragment从后台恢复、Spinner重新执行布局测量时),系统有可能在onItemSelected回调中传入null的view参数。而Kotlin对非空参数的严格校验,会比Java更早触发崩溃(Java只会在你实际使用null的view时才报错)。
修复方案
只需要把onItemSelected方法里的view参数改成可空类型View?即可,如果后续需要使用这个view,记得先做null安全判断。修改后的完整代码如下:
val spinner: Spinner = root.findViewById(R.id.store_select_spinner) val spinnerAdapter: ArrayAdapter<String> = ArrayAdapter( requireContext(), R.layout.spinner_item, llNames ) spinnerAdapter.setDropDownViewResource(R.layout.spinner_item) spinner.adapter = spinnerAdapter spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected( parent: AdapterView<*>?, view: View?, // 将非空View改为可空View? position: Int, id: Long ) { // 若要操作view,先通过let做null安全处理 view?.let { selectedView -> // 例如修改选中项的样式等操作 // selectedView.setTextColor(Color.RED) } } override fun onNothingSelected(parent: AdapterView<*>?) { } }
补充说明
首次加载Fragment时Spinner能正常工作,是因为此时视图初始化完整,系统可以正确传入对应的view实例;但Fragment切换到后台后,视图可能被销毁回收,再次返回时Spinner重新绑定数据并触发选择回调,这时候视图可能还未完全重建,系统就会传入null的view参数,进而触发Kotlin的非空检查异常。
内容的提问来源于stack exchange,提问作者Lexie Kun
相关产品推荐
相关产品推荐

