在Kotlin Multiplatform中,如何在三星设备上强制实现透明状态栏?

移动开发 2026-07-09

我开发了一个带透明系统栏的应用,在我的Pixel 7和多版本Android的所有虚拟设备上(7.0、9.0、14.0、15.0、16.0),系统栏都能正确显示为透明。但是在朋友的三星Galaxy S23 Ultra(Android 14)上,系统栏却是黑色的:

Screenshot from Samsung with Android 14 (black status bar)

Screenshot from virtual Android 14 (transparent status bar)

在他手机的其他应用中,状态栏是透明的。 有人遇到过同样的问题吗,或者有相关经验可以提供帮助?三星设备在状态栏方面需要特殊处理吗?

这是我应用中相关的代码片段:

SystemAppearance:

@Composable
actual fun SystemAppearance(isDark: Boolean) {
    val view = LocalView.current
    val colorScheme = MaterialTheme.colorScheme

    if (!view.isInEditMode) {
        SideEffect {
            val window = (view.context as Activity).window

            WindowCompat.setDecorFitsSystemWindows(window, false)

            val controller = WindowCompat.getInsetsController(window, window.decorView)
            controller.isAppearanceLightStatusBars = false
            controller.isAppearanceLightNavigationBars = !isDark

            if (Build.VERSION.SDK_INT >= 28) { // >= Android 9
                window.attributes.layoutInDisplayCutoutMode = android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
            }

            @Suppress("DEPRECATION")
            if (Build.VERSION.SDK_INT >= 29) { // >= Android 10
                window.statusBarColor = Color.Transparent.toArgb()
                window.navigationBarColor = Color.Transparent.toArgb()
            }
            else if (Build.VERSION.SDK_INT <= 25) { // <= Android 7
                window.statusBarColor = colorScheme.primaryContainer.toArgb()
                window.navigationBarColor = colorScheme.primaryContainer.toArgb()
            }
            else {
                window.statusBarColor = colorScheme.primaryContainer.toArgb()
                window.navigationBarColor = Color.Transparent.toArgb()
            }

            if (Build.VERSION.SDK_INT >= 29) { // >= Android 10
                window.isStatusBarContrastEnforced = false
                window.isNavigationBarContrastEnforced = false
            }
        }
    }
}

在MainActivity.kt中:

        enableEdgeToEdge(
            statusBarStyle = SystemBarStyle.dark(
                android.graphics.Color.TRANSPARENT
            ),
            navigationBarStyle = SystemBarStyle.light(
                android.graphics.Color.TRANSPARENT,
                android.graphics.Color.TRANSPARENT
            )
        )

在Theme.kt中:

@Composable
fun SongBookTheme(
    darkTheme: Boolean = isSystemInDarkTheme(),
    fontSize: Float = 16f,
    content: @Composable () -> Unit
) {
    val colorScheme = if (darkTheme) DarkColorScheme else LightColorScheme

    MaterialTheme(
        colorScheme = colorScheme,
        typography = getTypography(fontSize.sp)
    ) {
        SystemAppearance(darkTheme)
        content()
    }
}

The SongBookTheme is called in MainActivity after enableEdgeToEdge() inside the setContent block.

解决方案

我发现,当我把build.gradle.kts中 android块的defaultConfig的 applicationId从 "com.andryuser.psalmsofzion" 改为 "com.andryuser.anyotherstring" 时,状态栏就变得透明了。有人能解释这种行为吗?

这是我在build.gradle.kts中的android块:

android {
    namespace = "com.andryuser.psalmsofzion"
    compileSdk = libs.versions.android.compileSdk.get().toInt()

    defaultConfig {
        applicationId = "com.andryuser.psalmsofzion"
        minSdk = libs.versions.android.minSdk.get().toInt()
        targetSdk = libs.versions.android.targetSdk.get().toInt()
        versionCode = 9
        versionName = "1.0"
    }
    packaging {
        resources {
            excludes += "/META-INF/{AL2.0,LGPL2.1}"
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_21
        targetCompatibility = JavaVersion.VERSION_21
    }
    buildTypes {
        getByName("release") {
            isMinifyEnabled = true
            isShrinkResources = true
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
    }
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章