Android Fragment中实现带图自定义Spinner触发空指针异常如何解决
解决方案
错误根因
报错指向的NullPointerException和Context传参无关,本质是你调用setAdapter时,moodSpinner对象本身为null:要么你没有正确从Fragment布局中查找到该控件实例,要么初始化代码执行时机早于Fragment布局加载完成。
修复步骤
- 第一步:调整初始化代码的执行时机
所有控件初始化逻辑必须放在Fragment的onViewCreated生命周期方法中执行,禁止在onCreate/onCreateView中提前操作控件。 - 第二步:正确查找Fragment布局中的控件
必须使用onViewCreated方法传入的根View对象查找Fragment布局内的控件,不能直接用Activity的上下文查找:override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 从Fragment的根view中查找Spinner val moodSpinner = view.findViewById<Spinner>(R.id.moodSpinner) // 设置Adapter,Context传requireContext()即可 moodSpinner.adapter = MoodArrayAdapter(requireContext(), listOf( Mood(R.drawable.angry, "Angry"), Mood(R.drawable.happy, "Happy"), Mood(R.drawable.playful, "Playful"), Mood(R.drawable.wondering, "Wondering") )) } - 第三步:核对基础配置
确认fragment.xml中Spinner控件的id为@+id/moodSpinner,无拼写错误;同时确认onCreateView中加载的布局是你放置Spinner的Fragment布局文件,示例:override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { // 此处布局id要和你放Spinner的xml文件名对应 return inflater.inflate(R.layout.fragment1, container, false) }
额外注意
如果你在使用已废弃的Kotlin Android Extensions(直接用id访问控件),同样需要在onViewCreated之后再访问控件,提前访问会返回null。
内容的提问来源于stack exchange,提问作者BenC
相关产品推荐
相关产品推荐

