Android Fragment监听器空对象引用问题求助
解决MessageFragment中点击ListView抛出NullPointerException的问题
这个空指针异常的原因很明确——你Fragment里的Listener变量始终是null!虽然你在MainActivity里实现了MessageFragment.OnItemSelectedListener接口,但你从来没把Activity的实例赋值给Fragment里的这个Listener对象,所以当点击ListView触发回调时,调用Listener.onItemSelectedMessageFragment(position)就会抛出空指针。
修复步骤
你需要在Fragment和Activity建立关联的时候,完成Listener的赋值,具体可以通过重写Fragment的onAttach方法来实现:
- 重写
onAttach方法,将依附的Activity实例赋值给Listener
@Override public void onAttach(@NonNull Context context) { super.onAttach(context); try { // 把上下文强制转换为我们定义的监听接口 Listener = (OnItemSelectedListener) context; } catch (ClassCastException e) { // 如果Activity没实现接口,抛出明确的异常信息,方便排查 throw new ClassCastException(context.toString() + " must implement OnItemSelectedListener"); } }
- 重写
onDetach方法,清空Listener避免内存泄漏
@Override public void onDetach() { super.onDetach(); Listener = null; }
修改后的完整Fragment代码
public class MessageFragment extends Fragment { OnItemSelectedListener Listener; @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_message, container, false); List<String> dummyList = new ArrayList<>(); for (int i = 0; i < DummyDataProvider.getDummyData().size(); i++) { dummyList.add(DummyDataProvider.getDummyData().get(i).getDummyData() +" "+ i); } ListView listView = (ListView) view.findViewById(R.id.messageFragmentListView); ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1,dummyList); listView.setAdapter(listAdapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Listener.onItemSelectedMessageFragment(position); } }); return view; } @Override public void onAttach(@NonNull Context context) { super.onAttach(context); try { Listener = (OnItemSelectedListener) context; } catch (ClassCastException e) { throw new ClassCastException(context.toString() + " must implement OnItemSelectedListener"); } } @Override public void onDetach() { super.onDetach(); Listener = null; } public interface OnItemSelectedListener{ void onItemSelectedMessageFragment(int position); } }
这样修改后,当Fragment依附到MainActivity时,Listener就会被正确赋值为MainActivity的实例,点击ListView时就能正常触发Activity里的Toast提示了。
内容的提问来源于stack exchange,提问作者Marko Dunovic
相关产品推荐
相关产品推荐

