如何更改 Jetpack Compose + Material 3 中的状态栏颜色

Van*_*yen 6 android android-statusbar android-jetpack-compose

我正在关注developer.google的主题教程。我正在尝试将应用程序迁移到 Mat。3、修改状态栏的颜色以与背景颜色相匹配。

  • 添加android:statusBarColor和后android:windowLightStatusBar,没有任何变化。

  • 我注意到在应用程序加载的第一时刻,状态栏确实符合我的预期,但过了一会儿就变得错误了。

之前: https: //i.stack.imgur.com/i43cL.png

之后: https: //i.stack.imgur.com/kMwaP.png

我尝试过的:

// res/values/themes.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="Theme.Superheroes" parent="android:Theme.Material.Light.NoActionBar">
        <item name="android:statusBarColor">@color/background_light</item>
        <item name="android:windowLightStatusBar">true</item>
        <item name="android:windowBackground">@color/background_light</item>
    </style>
</resources>
Run Code Online (Sandbox Code Playgroud)
// res/values-night/themes.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="Theme.Superheroes" parent="android:Theme.Material.NoActionBar">
        <item name="android:statusBarColor">@color/background_dark</item>
        <item name="android:windowLightStatusBar">false</item>
        <item name="android:windowBackground">@color/background_dark</item>
    </style>
</resources>
Run Code Online (Sandbox Code Playgroud)

Van*_*yen 10

另一种在不添加依赖项的情况下更改它的方法是ui.theme/Theme.kt@2801938 提到的:

@Composable
fun YourAppTheme(darkTheme...) {
    ...
    val view = LocalView.current
    if (!view.isInEditMode) {
        SideEffect {
            val window = (view.context as Activity).window
            window.statusBarColor = colorScheme.primary.toArgb()
            WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme
        }
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)


Cod*_*oet 6

[已弃用]

在 Jetpack Compose 中,最简单的方法是使用 Accompanist System UI Controller。

将其添加到您的依赖项中:implementation "com.google.accompanist:accompanist-systemuicontroller:0.27.0"

然后,在您的 MainActivity 中:

setContent {
            MyTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    val systemUiController = rememberSystemUiController()

                    SideEffect {
                        systemUiController.setStatusBarColor(
                            color = Color(0xff655D8A),
                        )
                    }
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

来源和详细信息在这里。