MIUI 上出现 Material3 的 DropdownMenu 时会弹出导航栏

问题描述 投票:0回答:1

我的 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
            }
        }
    }
}

到目前为止我已经尝试过了

  • dismiss-false --
    properties = PopupProperties(dismissOnBackPress = false)
    作为 DropdownMenu 参数(我最初的发现)
  • SideEffect -
    SideEffect { MyActivity.hideNavBarAgain() }
    (由 @rafael-moreira 建议),在 MenuSample 及其周围的每个可能的可组合范围中。
  • remCorSc.launch --
    rememberCoroutineScope.launch { PaletteActivity.hideNavBarAgain() }
    在用户单击启用菜单的 lambda 时

实验矩阵(导航栏在所有情况下都隐藏在 OnCreate() 中):

解雇假 副作用 remCorSc.launch 结果
😣永久导航栏GIF1
😕 跳跃的导航栏 GIF2
😣永久导航栏
😣永久导航栏
😕 跳跃的导航栏

毫无价值,这一切都发生在 MIUI 13 上。在相对纯粹的 Android 14(Nothing OS)上,这一切都不会发生! 0 个解决方法 (➖|➖|➖) 按预期给出了缺少的导航栏,MyActivity 配置就足够了。

如何正确防止导航栏在所有平台上首先显示?

android xiaomi miui android-compose
1个回答
0
投票

这是因为 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
                )
            })
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.