Fragment中使用Spinner报错:ArrayAdapter上下文参数不正确如何解决?
解决Fragment中ArrayAdapter传入Context的参数错误问题
这问题我之前在开发Fragment组件时也踩过坑,核心原因很简单:Fragment类本身并不是Context的子类,而Activity是Context的子类,所以在Activity里能直接用this当Context,但在Fragment里这么做就会出现类型不匹配的错误。
给你两种靠谱的解决方法:
方法1:使用getActivity()获取Context
getActivity()会返回当前Fragment依附的Activity实例,而Activity本身就是Context,所以可以直接替换掉代码里的this:
修改后的核心代码行:
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, list);
注意:要确保调用这个方法时,Fragment已经成功依附到Activity上(比如在
onViewCreated()或者onStart()生命周期方法里调用setUpSpinner()),否则getActivity()可能返回null导致空指针异常。
方法2:使用requireContext()(推荐)
如果你用的是AndroidX Fragment库,更推荐用requireContext(),它会在当前Fragment没有可用Context时直接抛出IllegalStateException,帮你更早发现问题,比getActivity()更严谨:
修改后的核心代码行:
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(requireContext(), android.R.layout.simple_spinner_item, list);
完整修改后的setUpSpinner()方法
void setUpSpinner() { Spinner spinner2; spinner2 = (Spinner) myView.findViewById(R.id.spinner2); List<String> list = new ArrayList<String>(); list.add("list 1"); list.add("list 2"); list.add("list 3"); // 这里替换成requireContext()或者getActivity() ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(requireContext(), android.R.layout.simple_spinner_item, list); dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner2.setAdapter(dataAdapter); }
另外再提个小建议:最好在Fragment的onViewCreated()方法里调用setUpSpinner(),因为此时myView已经被初始化完成,不会出现findViewById返回null的情况哦~
内容的提问来源于stack exchange,提问作者Ted pottel
相关产品推荐
相关产品推荐

