为了确保问题不在我自己的代码中,我用非常基本的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相关问答推荐

Android开发:主题排版不适用于按钮文本

LocalContext.current的问题(@Composable调用只能从@Composable函数的上下文发生)

Modifer.Align()不适用于行/列/框中的文本.未解决的作用域实例错误

在更改MuableState的值后,Android API 26(Oreo)上的Composable不能重新组合

空数据来自改装

为什么可以';我不能直接在RecyclerView.ViewHolder中访问视图ID吗?

Android Kotlin - 计费 - 从应用内购买获取productId

Android studio应用判断无法打开离线数据库

布局可组合项如何具有可测量和约束参数?

Android:使用依赖项 ViewModelProviderFactory 初始化 ViewModel 的正确方法

如何正确地将图像上传到 Jetpack Compose 中的 LazyList 中的项目?

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

无法 HEAD 'https://jcenter.bintray.com/com/facebook/react/react-native/maven-metadata.xml'

JCenter 是否永久关闭(10 月 31 日)?

如何从我的 android 应用程序中删除 QUERY_ALL_PACKAGES 权限?

Delphi 11:以编程方式查找 MSBuild 的正确工具版本

关于launchWhenX和repeatOnLifecycle的问题

Google API:java.lang.ClassNotFoundException:找不到类sun.misc.Service

具有自定义布局和 EditText 的 AlertDialog.Builder;无法访问视图

滑动以关闭 RecyclerView