在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
相关产品推荐
相关产品推荐

