MIUI中Material3 DropdownMenu弹出导致导航栏异常显示的解决方案
我有一个隐藏导航栏的纯Compose Activity,原本运行正常,但显示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) 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 } } } }
已尝试的方案
- dismiss-false:将
properties = PopupProperties(dismissOnBackPress = false)作为DropdownMenu参数 - SideEffect:在MenuSample及外围添加
SideEffect { MyActivity.hideNavBarAgain() } - remCorSc.launch:在菜单触发点击lambda中执行
rememberCoroutineScope.launch { MyActivity.hideNavBarAgain() } - onPlaced:为DropdownMenu和DropdownMenuItem添加
Modifier.onPlaced { MyActivity.hideNavBarAgain() }
实验矩阵(所有案例导航栏均在OnCreate()中隐藏)
| dismiss-false | SideEffect | remCorSc.launch | onPlaced | outcome |
|---|---|---|---|---|
| ➖ | ➖ | ➖ | ➖ | 😣 导航栏持续显示 |
| ➕ | ➖ | ➖ | ➖ | 😕 导航栏跳动显示 |
| ➖ | ➕ | ➖ | ➖ | 😣 导航栏持续显示 |
| ➖ | ➖ | ➕ | ➖ | 😣 导航栏持续显示 |
| ➕ | ➕ | ➕ | ➕ | 😕 导航栏跳动显示 |
所有问题仅发生在MIUI 13上,纯净Android 14(Nothing OS)无此问题,仅靠Activity配置即可正常隐藏导航栏。请问如何在所有平台上正确阻止导航栏弹出?
内容的提问来源于stack exchange,提问作者multistackdeveloper
相关产品推荐
相关产品推荐

