在Kotlin Multiplatform中,如何在三星设备上强制实现透明状态栏?
我开发了一个带透明系统栏的应用,在我的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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。