BottomNavigationView切换最后标签页时上跳留空白,状态栏设置问题求助
我之前也碰到过一模一样的情况,这本质是状态栏透明+内容延伸场景下的WindowInsets适配冲突问题。给你几个亲测有效的解决方案:
1. 先确认Activity主题的正确配置
首先保证你的Activity主题已经开启状态栏透明和内容延伸,在res/values/styles.xml的对应主题里添加这些属性:
<item name="android:statusBarColor">@android:color/transparent</item> <item name="android:windowDrawsSystemBarBackgrounds">true</item> <item name="android:windowTranslucentStatus">false</item> <!-- 可选:适配刘海屏,让内容自然延伸到刘海区域 --> <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
2. 手动处理BottomNavigationView的WindowInsets
别再依赖fitsSystemWindows属性了,改用WindowInsetsCompat精确控制导航栏位置。你可以在Activity的onCreate或者ExplorerFragment的onViewCreated里添加这段代码:
// 替换成你自己的BottomNavigationView id BottomNavigationView bottomNav = requireActivity().findViewById(R.id.bottom_nav); ViewCompat.setOnApplyWindowInsetsListener(bottomNav, (view, insets) -> { WindowInsetsCompat compatInsets = WindowInsetsCompat.toWindowInsetsCompat(insets); // 获取系统导航栏的底部Insets高度 int bottomInset = compatInsets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom; // 给BottomNavigationView设置底部padding,让它牢牢贴住屏幕底部 view.setPadding( view.getPaddingLeft(), view.getPaddingTop(), view.getPaddingRight(), bottomInset ); // 返回处理后的Insets,避免上层View重复处理导致冲突 return compatInsets.consumeSystemWindowInsets(); });
3. 移除布局中的fitsSystemWindows属性
检查你的ExplorerFragment根布局、Activity根布局以及NavHostFragment的容器布局,全部移除android:fitsSystemWindows="true"这个属性。它会让View自动处理Insets,很容易和我们手动设置的逻辑冲突,导致导航栏偏移。
为什么之前设置fitSystemWindows=false没用?
因为fitsSystemWindows是ViewGroup级别的属性,Fragment切换时不同页面的布局可能会覆盖这个设置;而且BottomNavigationView本身没正确获取到系统导航栏的Insets,导致它没有底部padding——你看到的底部空白,其实是屏幕底部到系统导航栏的距离,只是没被填充而已。
内容的提问来源于stack exchange,提问作者Drunken Daddy
相关产品推荐
相关产品推荐

