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

在DrawerLayout中动态修改Floating Action Button图标报空指针异常

问题成因
  • 核心错误出在ContextCompat.getDrawable(getParent(), R.drawable.icon_add)中的getParent()调用:当前代码运行在独立Activity的生命周期内,getParent()方法仅当Activity作为子Activity嵌入其他父容器时才会返回有效对象,绝大多数场景下调用会返回null。
  • 你传入null作为Context参数调用ContextCompat.getDrawable(),方法会返回null,后续setImageDrawable传入null就会触发NullPointerException。
  • 点击事件没有报错是因为你在点击回调中用的是getApplicationContext()获取有效上下文,没有用到getParent(),所以运行正常。
解决方案

直接将getParent()替换为当前Activity的有效上下文即可,示例修改代码如下:

//Change fab icon when branch fragment open
navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() {
    @Override
    public void onDestinationChanged(@NonNull NavController controller, @NonNull NavDestination destination, @Nullable Bundle arguments) {
        if (destination.getId() == R.id.nav_cabang) {
            // 将getParent替换为当前Activity实例MenuDrawer.this
            fab.setImageDrawable(ContextCompat.getDrawable(MenuDrawer.this, R.drawable.icon_add));
        } else {
            // 可选补充:切换到其他Fragment时恢复fab默认图标
            fab.setImageDrawable(ContextCompat.getDrawable(MenuDrawer.this, R.drawable.icon_cart));
        }
    }
});

如果修改后仍有报错,可额外排查以下两点:

  • 确认R.drawable.icon_add资源文件存在,没有写错资源名称
  • 如果目标页面有单独的fab交互逻辑,可以同步修改fab的点击事件,避免不同页面共用同一点击逻辑出现业务错误

内容的提问来源于stack exchange,提问作者Rahmad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 01:57:02