Accompanist BottomNavigation获取导航栏底部内边距数值过大
问题根因
导致底部空白过大的原因有三个:
- 单位转换逻辑错误:
WindowInsets.navigationBars.getBottom(density)返回值单位是像素(px),直接调用.dp会把像素数值错误当作dp值做二次换算,最终得到的padding值是实际需求的density倍,在高密度屏上数值会膨胀2-3倍 - 未开启边到边(Edge-to-Edge)配置:如果没有在Activity中关闭系统默认的内容自适应padding,WindowInsets返回的导航栏高度是系统预留的全布局占位高度,不是沉浸式场景下的内容偏移值
- 重复计算内边距:Accompanist提供的
BottomNavigation组件默认已经内置了导航栏insets适配逻辑,手动叠加padding会导致边距累加
正确实现方案
第一步:配置沉浸式边到边基础
在宿主Activity的onCreate方法中,调用setContent前添加如下配置,关闭系统默认的内容边距处理:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) WindowCompat.setDecorFitsSystemWindows(window, false) setContent { // 你的应用主题、页面根布局 } }
第二步:修正导航栏组件实现
优先使用Compose/Accompanist官方提供的Insets扩展方法,不要手动做单位换算,避免计算错误:
@Composable fun NavigationBar( navController: NavHostController, modifier: Modifier = Modifier, ) { BottomNavigation( modifier = modifier.navigationBarsPadding(), // 移除手动设置的bottom contentPadding,避免重复叠加边距 ) { // 内部导航项逻辑 } }
如果业务场景必须手动获取导航栏高度的dp值,使用正确的单位转换写法:
val density = LocalDensity.current val bottomPadding = with(density) { WindowInsets.navigationBars.getBottom(density).toDp() }
注意:如果项目中已经使用了Accompanist的
ProvideWindowInsets,请确认没有嵌套多层Insets消费逻辑,否则也会出现Insets值累加异常的问题。
问题效果参考

内容的提问来源于stack exchange,提问作者Francesc
相关产品推荐
相关产品推荐

