底部导航栏与 Jetpack Compose 中的屏幕内容重叠
Bottom Nav Bar overlaps screen content in Jetpack Compose
我有一个 BottomNavBar
在 Scaffold
的 bottomBar
中调用。
每个屏幕都包含一个显示一堆图像的 LazyColumn
。
出于某种原因,当我完成滚动时,BottomNavBar
与项目列表的下部重叠。
我该如何解决这个问题?
这里是MainActivity的设置内容
SetContent{
Scaffold(
topBar = {
TopAppBar(
title = { Text(text = "tartufozon") },
actions = {
IconButton(onClick = { Timber.d("Mail clicked") }) {
Icon(Icons.Default.Email, contentDescription = null)
}
}
)
},
bottomBar = {
BottomNavBar(navController = navController)
}
) {
BottomNavScreensController(navController = navController)
}
}
根据 API definition for Scaffold, your inner content (the trailing lambda you have your BottomNavScreensController
in), is given a PaddingValues
对象,为您的顶部应用栏、底部栏等提供适当的填充量
现在,您根本没有引用该填充,因此,您的内容没有填充。这就是导致重叠的原因。
您可以在 BottomNavScreensController
周围添加一个 Box
以应用填充,或者将填充直接传递到您的 BottomNavScreensController
以便每个单独的屏幕都可以正确应用填充;两种解决方案都有效。
Scaffold(
topBar = {
//
},
bottomBar = {
//
}
) { innerPadding ->
// Apply the padding globally to the whole BottomNavScreensController
Box(modifier = Modifier.padding(innerPadding)) {
BottomNavScreensController(navController = navController)
}
}
}
遵循 ianhanniballake 的回答及其评论,只是为了节省您几分钟的时间。代码类似于:
Scaffold(
topBar = {
//
},
bottomBar = {
//
}
) { innerPadding ->
Box(modifier = Modifier.padding(
PaddingValues(0.dp, 0.dp, 0.dp, innerPadding.calculateBottomPadding()) {
BottomNavScreensController(navController = navController)
}
}
}
您不再需要进行任何计算。在脚手架内容中,执行:
content = { padding ->
Column(
modifier = Modifier.padding(padding)
) {...
Scaffold(
bottomBar = {
BottomNavigationBar(navController = navController)
}
) { innerPadding ->
Box(modifier = Modifier.padding(innerPadding)) {
DestinationsNavHost(
navGraph = NavGraphs.root,
navController = navController,
engine = navHostEngine
)
}
}
我有一个 BottomNavBar
在 Scaffold
的 bottomBar
中调用。
每个屏幕都包含一个显示一堆图像的 LazyColumn
。
出于某种原因,当我完成滚动时,BottomNavBar
与项目列表的下部重叠。
我该如何解决这个问题?
这里是MainActivity的设置内容
SetContent{
Scaffold(
topBar = {
TopAppBar(
title = { Text(text = "tartufozon") },
actions = {
IconButton(onClick = { Timber.d("Mail clicked") }) {
Icon(Icons.Default.Email, contentDescription = null)
}
}
)
},
bottomBar = {
BottomNavBar(navController = navController)
}
) {
BottomNavScreensController(navController = navController)
}
}
根据 API definition for Scaffold, your inner content (the trailing lambda you have your BottomNavScreensController
in), is given a PaddingValues
对象,为您的顶部应用栏、底部栏等提供适当的填充量
现在,您根本没有引用该填充,因此,您的内容没有填充。这就是导致重叠的原因。
您可以在 BottomNavScreensController
周围添加一个 Box
以应用填充,或者将填充直接传递到您的 BottomNavScreensController
以便每个单独的屏幕都可以正确应用填充;两种解决方案都有效。
Scaffold(
topBar = {
//
},
bottomBar = {
//
}
) { innerPadding ->
// Apply the padding globally to the whole BottomNavScreensController
Box(modifier = Modifier.padding(innerPadding)) {
BottomNavScreensController(navController = navController)
}
}
}
遵循 ianhanniballake 的回答及其评论,只是为了节省您几分钟的时间。代码类似于:
Scaffold(
topBar = {
//
},
bottomBar = {
//
}
) { innerPadding ->
Box(modifier = Modifier.padding(
PaddingValues(0.dp, 0.dp, 0.dp, innerPadding.calculateBottomPadding()) {
BottomNavScreensController(navController = navController)
}
}
}
您不再需要进行任何计算。在脚手架内容中,执行:
content = { padding ->
Column(
modifier = Modifier.padding(padding)
) {...
Scaffold(
bottomBar = {
BottomNavigationBar(navController = navController)
}
) { innerPadding ->
Box(modifier = Modifier.padding(innerPadding)) {
DestinationsNavHost(
navGraph = NavGraphs.root,
navController = navController,
engine = navHostEngine
)
}
}