我的 Activity 带有隐藏的导航栏和纯 Compose 内容。它按预期工作,直到显示 androidx.compose.material3.DropdownMenu。此时导航栏回来了,当菜单关闭时它再次隐藏:GIF1。然后我就做了
DropdownMenu(properties = PopupProperties(dismissOnBackPress = false))
。现在,当菜单出现时,导航栏会弹出,并通过动画快速隐藏起来:GIF2。
@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)
Companion.window = window
hideNavBarAgain()
setContent { MyJetpackContent() }
}
companion object { //for experimentation purposes
var window: Window? = null
fun hideNavBarAgain() {
WindowInsetsControllerCompat(window!!, window!!.decorView).let { controller ->
controller.hide(WindowInsetsCompat.Type.navigationBars())
controller.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
}
}
}
}
properties = PopupProperties(dismissOnBackPress = false)
作为 DropdownMenu 参数(我最初的发现)SideEffect { MyActivity.hideNavBarAgain() }
(由 @rafael-moreira 建议),在 MenuSample 及其周围的每个可能的可组合范围中。rememberCoroutineScope.launch { PaletteActivity.hideNavBarAgain() }
在用户单击启用菜单的 lambda 时实验矩阵(导航栏在所有情况下都隐藏在 OnCreate() 中):
解雇假 | 副作用 | remCorSc.launch | 结果 |
---|---|---|---|
➖ | ➖ | ➖ | 😣永久导航栏GIF1 |
➕ | ➖ | ➖ | 😕 跳跃的导航栏 GIF2 |
➖ | ➕ | ➖ | 😣永久导航栏 |
➖ | ➖ | ➕ | 😣永久导航栏 |
➕ | ➕ | ➕ | 😕 跳跃的导航栏 |
毫无价值,这一切都发生在 MIUI 13 上。在相对纯粹的 Android 14(Nothing OS)上,这一切都不会发生! 0 个解决方法 (➖|➖|➖) 按预期给出了缺少的导航栏,MyActivity 配置就足够了。
如何正确防止导航栏在所有平台上首先显示?
这是因为 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
)
})
}
}