我的 Activity 带有隐藏的导航栏和纯 Compose 内容。它按预期工作,直到显示 androidx.compose.material3.DropdownMenu。此时导航栏回来了,当菜单关闭时它再次隐藏。然后我就做了
DropdownMenu(properties = PopupProperties(dismissOnBackPress = false))
。现在,当菜单出现时,导航栏会弹出,并通过动画快速隐藏起来。
@Composable
fun MenuSample(onSearch: () -> Unit) {
var expanded by remember { mutableStateOf(false) }
DropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false },
properties = PopupProperties(dismissOnBackPress = false)
) {
DropdownMenuItem(
text = { Text("Search") },
onClick = onSearch,
leadingIcon = {
Icon(
Icons.Outlined.Search,
contentDescription = null
)
})
}
}
导航栏缺失的配置如下:
class MyActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
WindowInsetsControllerCompat(window, window.decorView).let { controller ->
controller.hide(WindowInsetsCompat.Type.navigationBars())
controller.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
}
setContent {
MyJetpackContent()
}
}
}
如何正确防止导航栏显示在第一位?
这是因为 DropDownMenu 就行为而言被视为弹出窗口。就像用户正在与屏幕交互一样。
使用可组合的 SideEffect 在显示或不显示时与 DropDownMenu(来自 MenuSample)创建反应,以避免显示导航栏。
示例:
将 SideEffect 添加到 MenuSample 函数中,并在调用 MenuSample 时将窗口对象作为参数。 有关更多详细信息,请查看文档。
@Composable
fun MenuSample(onSearch: () -> Unit, window: Window) {
var expanded by remember { mutableStateOf(false) }
SideEffect {
WindowInsetsControllerCompat(window, window.decorView).let { controller ->
controller.hide(WindowInsetsCompat.Type.navigationBars())
controller.systemBarsBehavior =
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
}
}
DropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false },
properties = PopupProperties(dismissOnBackPress = false)
) {
DropdownMenuItem(
text = { Text("Search") },
onClick = onSearch,
leadingIcon = {
Icon(
Icons.Outlined.Search,
contentDescription = null
)
})
}
}