打开DrawerNavigator隐藏ActionBar后,如何移除残留阴影?
我之前也踩过一模一样的坑!你用getSupportActionBar().hide()和setElevation(0)没效果,大概率是因为阴影不是来自ActionBar本身,而是自定义Toolbar的属性、DrawerLayout的层级冲突,或者视图隐藏不彻底导致的。给你几个实测有效的解决方案:
方案1:直接操作Toolbar的elevation属性
ActionBar的elevation设置有时候会因为主题或布局优先级不生效,不如直接找到你布局里的Toolbar实例,在抽屉状态切换时手动修改它的阴影:
- 先获取Toolbar实例:
Toolbar toolbar = findViewById(R.id.your_toolbar_id); // 替换成你布局里的Toolbar ID - 在DrawerListener里更新elevation:
drawer.addDrawerListener(new DrawerLayout.SimpleDrawerListener() { @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); if (getSupportActionBar() != null) { getSupportActionBar().hide(); } // 强制移除Toolbar阴影 toolbar.setElevation(0f); } @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); if (getSupportActionBar() != null) { getSupportActionBar().show(); } // 恢复原有的阴影高度(可以从dimens里取预设值) toolbar.setElevation(getResources().getDimension(R.dimen.toolbar_default_elevation)); } });
方案2:直接隐藏Toolbar而非ActionBar
有时候ActionBar.hide()只是将其移出屏幕,但视图仍会保留渲染,导致阴影残留。试试直接把Toolbar设为GONE:
@Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); toolbar.setVisibility(View.GONE); // 完全隐藏Toolbar,连阴影一起消失 } @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); toolbar.setVisibility(View.VISIBLE); // 恢复显示 }
方案3:检查DrawerLayout的fitsSystemWindows属性
如果你的DrawerLayout设置了android:fitsSystemWindows="true",可能会导致布局层级叠加,阴影“漏”在抽屉上方。可以尝试将其改为false,或者调整Toolbar的布局参数,确保它在抽屉打开时完全被覆盖。
方案4:清除主题中的默认阴影
检查你的App主题,是否设置了android:windowContentOverlay属性,这个属性会给窗口添加默认阴影。可以在主题里将其设为@null:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- 移除窗口默认阴影 --> <item name="android:windowContentOverlay">@null</item> </style>
另外还要注意:如果你的Toolbar使用了带阴影的自定义背景Drawable(比如带elevation的shape),也要记得在抽屉打开时替换成无阴影的背景,或者直接移除背景的阴影属性。
内容的提问来源于stack exchange,提问作者Alberto Crespo
相关产品推荐
相关产品推荐

