Android Fragment调用DialogFragment触发空对象引用报错解决
Fragment中调用DialogFragment触发空对象引用报错解决方案
问题现象
在Fragment中弹出DialogFragment,点击Dialog内的保存按钮时,抛出Attempt to invoke interface method on a null object reference错误,报错位置为Dialog中调用接口回调的mListener.saveNewPelanggan(pelanggan)行。
报错根因
- Dialog中的回调实例
mListener未被正确初始化,值为null。 - 原有代码在
onAttach生命周期中通过getTargetFragment()获取实现了回调接口的宿主Fragment,但弹出Dialog时没有调用setTargetFragment()绑定宿主,导致getTargetFragment()返回null。 - 额外说明:
getTargetFragment()/setTargetFragment()已在AndroidX Fragment 1.3.0+版本被官方废弃,存在状态丢失、跨Fragment通信不可靠的问题,不建议继续使用。
修复方案
方案1:快速兼容修复(不推荐长期使用)
在弹出Dialog的代码中补充设置目标Fragment,即可让原有getTargetFragment()逻辑正常拿到宿主实例:
修改PelangganFragment中的openCreatePelangganDialog方法:
private void openCreatePelangganDialog() { CreatePelangganDialog createPelangganDialog = new CreatePelangganDialog(); // 补充设置目标Fragment为当前Fragment,requestCode传非负整数即可 createPelangganDialog.setTargetFragment(this, 0); createPelangganDialog.show(getChildFragmentManager(), CreatePelangganDialog.TAG); }
方案2:官方推荐规范写法(无废弃API,更稳定)
由于你是通过getChildFragmentManager()从PelangganFragment弹出Dialog,Dialog的直接父Fragment就是PelangganFragment,可以直接在onAttach中获取父Fragment做类型校验,不需要手动设置target:
修改CreatePelangganDialog的onAttach方法:
@Override public void onAttach(@NonNull Context context) { super.onAttach(context); Fragment hostFragment = getParentFragment(); // 校验宿主Fragment是否实现了回调接口 if (hostFragment instanceof CreatePelangganListener) { mListener = (CreatePelangganListener) hostFragment; } else { throw new RuntimeException(hostFragment + " 必须实现CreatePelangganListener接口"); } }
改完后不需要修改弹出Dialog的代码,直接运行即可正常触发回调,不会再出现空指针。
额外注意项
- 所有跨Fragment的回调赋值都要加类型校验,不要直接强转,避免宿主未实现接口时触发类型转换异常。
- 如果Dialog是从Activity弹出的,把
getParentFragment()换成getActivity()做类型校验即可。
内容的提问来源于stack exchange,提问作者Sri
相关产品推荐
相关产品推荐

