Jetpack Compose:根据导航栏方向设置WindowInsets内边距
如何在Jetpack Compose中仅为侧边导航栏场景添加WindowInsets内边距
我正在参考Android官方视频《Insets: Compose edition》实现Edge to Edge UI,已将导航栏设为透明。竖屏时,内容可以显示在底部导航栏上方,且通过给
LazyColumn设置底部80dp内边距、单独给FloatingActionButton添加导航栏内边距,UI工作正常。但横屏(或导航栏在侧边的场景)时,内容会被侧边导航栏遮挡。我需要仅在导航栏位于侧边时,给内容应用导航栏的WindowInsets内边距,参考代码如下:
Scaffold( modifier = Modifier.fillMaxSize(), floatingActionButton = { FloatingActionButton( modifier = Modifier.windowInsetsPadding(WindowInsets.navigationBars), ) }, ) { LazyColumn( contentPadding = PaddingValues( bottom = 80.dp, ), ) { // List UI } }
你可以通过动态判断导航栏的位置,针对性地添加内边距。核心思路是获取导航栏Insets的具体方向值,判断是否存在侧边内边距,再动态构建PaddingValues:
import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.rememberWindowInsets import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp @Composable fun EdgeToEdgeScreen() { // 获取导航栏对应的内边距值,会随屏幕状态自动更新 val navigationBarInsets = rememberWindowInsets(WindowInsets.navigationBars).asPaddingValues() // 判断导航栏是否位于侧边:左右方向存在非0内边距 val hasSideNavigationBar = navigationBarInsets.start != 0.dp || navigationBarInsets.end != 0.dp Scaffold( modifier = Modifier.fillMaxSize(), floatingActionButton = { FloatingActionButton( modifier = Modifier.windowInsetsPadding(WindowInsets.navigationBars), onClick = { /* 处理点击事件 */ } ) { // FAB内部内容 } }, ) { scaffoldPadding -> LazyColumn( contentPadding = PaddingValues( // 仅侧边有导航栏时添加左右内边距 start = if (hasSideNavigationBar) navigationBarInsets.start else 0.dp, end = if (hasSideNavigationBar) navigationBarInsets.end else 0.dp, // 保留原有的底部内边距 bottom = 80.dp ), // 应用Scaffold的内边距,避免内容被顶部栏(若使用)遮挡 modifier = Modifier.padding(scaffoldPadding) ) { // 列表UI实现 items(100) { index -> // 列表项内容 } } } }
关键逻辑说明:
rememberWindowInsets(WindowInsets.navigationBars).asPaddingValues():实时获取导航栏的内边距数据,屏幕旋转、导航栏位置变化时会自动更新hasSideNavigationBar:通过检测左右方向的内边距是否非0,精准判断导航栏是否处于侧边- 动态构建
contentPadding:仅在侧边导航栏场景下添加左右内边距,既解决横屏遮挡问题,又不影响竖屏时内容延伸至底部导航栏上方的效果
内容的提问来源于stack exchange,提问作者Abhimanyu
相关产品推荐
相关产品推荐

