Jetpack Compose:顶部应用栏滚动行为不改变状态栏颜色

Nat*_*han 4 android-jetpack-compose android-jetpack-compose-material3

我已经实施了pinned顶部应用程序栏滚动容器,它适用于更改滚动时的应用程序栏颜色,但状态栏颜色根本不受影响。

这是我所拥有的:

val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())

Scaffold(
    Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
    topBar = {
        // just a wrapper for CenterAlignedTopAppBar
        StandardTopAppBar("Home", scrollBehavior = scrollBehavior)
    }
){ ... }

Run Code Online (Sandbox Code Playgroud)

如果相关,为了检测软键盘是否存在,我启用了:

WindowCompat.setDecorFitsSystemWindows(window, false)
Run Code Online (Sandbox Code Playgroud)

我的状态栏颜色最初在我的Theme. 当我在 android studio 中自动生成项目时,它被设置为原色,但我将其更改为表面颜色以匹配应用程序栏标准:

if (!view.isInEditMode) {
        SideEffect {

            (view.context as Activity).window.statusBarColor = colorScheme.surface.toArgb()
            //(view.context as Activity).window.statusBarColor = colorScheme.primary.toArgb()
            ViewCompat.getWindowInsetsController(view)?.isAppearanceLightStatusBars = !darkTheme // changed from just darkTheme
        }
    }

Run Code Online (Sandbox Code Playgroud)

太长;博士;顶部应用栏颜色在滚动时会发生变化,但状态栏不会。这里使用的正确模式是什么?我查看了一些代码pinnedScrollBehavior,没有看到任何会调用状态栏更改的内容,所以我想知道是否应该使状态栏透明并更改应用程序栏的插图?或者我应该手动连接滚动逻辑并自己更改颜色?任何帮助表示赞赏!

Ama*_*mal 7

在 中Theme.kt,在YourAppTheme()函数内添加。

WindowCompat.setDecorFitsSystemWindows(window, false)
Run Code Online (Sandbox Code Playgroud)

执行此操作将在 StatusBar 和 NavigationBar* 下面显示内容( 仅适用于旧版本的 Jetpack Compose。在较新的版本中,PaddingValues 默认设置正确。)。

现在将 StatusBar 和 NavigationBar 颜色设置为 Color.Transparent。

// make sure to use the compose color package, not the default one
import androidx.compose.ui.graphics.Color

window.statusBarColor = Color.Transparent.toArgb()
window.navigationBarColor = Color.Transparent.toArgb()
Run Code Online (Sandbox Code Playgroud)

您还需要确保Scaffold()使用从可组合项的回调中传递的填充值正确设置 的直接子级的填充值Scaffold()

为主题设置正确的颜色StatusBar和图标颜色。NavigationBar

WindowCompat.getInsetsController(window, window.decorView).isAppearanceLightStatusBars = !darkTheme

WindowCompat.getInsetsController(window, window.decorView).isAppearanceLightNavigationBars = !darkTheme
Run Code Online (Sandbox Code Playgroud)

如果您使用ModalBottomSheetLayoutBottomSheetScaffold,您还需要在 BottomSheet 可组合项中设置 Insets,以防止NavigationBar使用重叠应用程序内容,

Modifier.windowInsetsPadding(WindowInsets.navigationBars)
Run Code Online (Sandbox Code Playgroud)

编辑

在 Material3 中,window.setDecorFitsSystemWindows()仅兼容 > API 级别 30。

用于WindowCompat.setDecorFitsSystemWindows(window, false)向后兼容。