You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 03:03:27