You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 21:36:19