为了确保问题不在我自己的代码中,我用非常基本的MainActivity.kt创建了一个新的空项目:

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // enable full screen:
        // https://developer.android.com/jetpack/compose/layouts/insets#insets-setup
        enableEdgeToEdge()

        // enable immersive mode:
        // https://developer.android.com/develop/ui/views/layout/immersive
//        WindowInsetsControllerCompat(window, window.peekDecorView()).apply {
//            hide(WindowInsetsCompat.Type.statusBars())
//            systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
//        }

        setContent {
            Box(modifier = Modifier
                .fillMaxSize()
                .background(Color.Red)) {
                Text("Hello")
            }
        }
    }
}

WindowInsetsControllerCompat被注释掉时(如上例所示),结果与预期一致-内容被绘制在状态栏和导航栏的后面:

status bar visible

WindowInsetsControllerCompat被取消注释时,我希望内容被绘制在状态栏后面,并在状态栏图标隐藏的情况下进行剪切(就像上图一样).相反,我得到的是没有绘制任何内容的黑色区域:

status bar hidden

我已经在模拟器和物理设备上证实了这一行为.

我的问题是:使用Jetpack Compose,我如何才能实现这种效果?:

status bar expected behavior

推荐答案

我在这里找到了一个解决方案:https://developer.android.com/develop/ui/views/layout/display-cutout#best-practices

如果您的应用程序需要切换到和退出沉浸式模式,请使用shortEdgesnever剪切模式.一百零二

因此,为了允许在隐藏的系统栏LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES后面进行绘制,需要:

    enableEdgeToEdge()

    WindowInsetsControllerCompat(window, window.decorView).apply {
        hide(WindowInsetsCompat.Type.statusBars())
        systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
        window.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
    }

    setContent {
        ...
    }

Android相关问答推荐

打开平板电脑的下载文件夹中的文件,例如使用其mimeType将Intent发送到我们的应用程序

如何将两个变量传递给Nav主机,然后将其传递给另一个屏幕?

Jetpack Compose:带芯片的Textfield

页面更改时不显示 cogo toast 消息

SmsMessage如何在Kotlin库中工作?

为一组闪烁的可组合项制作动画,控制同步/定时

NFC getNdefMessage 在 Android 13 上写入标签后返回 null

如何在 Jetpack Compose 中的特定位置绘制图像

从 Jetpack Compose 中的 IconButton 中删除黑色色调

如何在 Jetpack Compose 中设置行宽等于 TextField 的宽度?

如何解决 compose 中material 图标的由于接收器类型不匹配,以下候选者都不适用

Jetpack Compose - 每次点击按钮都不起作用

为片段设置主题

LazyColumn 单选中的状态提升. Jetpack compose

try 使用 ViewPager2 实现滑动视图时出现类型不匹配错误

我不能在 jetpack Compose 中使用 TextField()(material 3)

并行运行两个挂起函数并在第一个返回时返回

在 Kotlin 客户端应用程序中发送 FCM 推送通知 - Firebase 云消息传递

如何在 TextInputEdit 中调整可绘制对象的大小

Jetpack Compose Tapjacking:过滤对模糊 UI 的touch