You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose从API34迁移至API35后导航栏显示异常问题

Android 15(API35)中BottomNavigation与系统导航栏样式不匹配的修复方案

问题核心

从API34升级到API35后,Android15虚拟机里应用底部导航栏的系统样式渲染异常,本质是两个问题:

  1. 代码中错误地用Color.hashCode()转换颜色值,这和颜色的ARGB值完全不是一回事,API34可能兼容了这种错误,但API35的系统导航栏处理逻辑更严格,导致颜色失效。
  2. Android15对Edge-to-Edge的系统栏配置逻辑有更新,原有的enableEdgeToEdge调用需要适配新的参数传递方式。

修复步骤

1. 修正颜色转换逻辑

把color.hashCode()替换为color.toArgb(),这才是正确的颜色值转换方式。修改后的EdgeToEdgeConfig代码:

@Composable
fun EdgeToEdgeConfig(
    activity: ComponentActivity,
    statusBarColor: Color = MaterialTheme.colorScheme.background,
    bottomBarColor: Color = MaterialTheme.colorScheme.background,
) {
    val isDarkMode = isSystemInDarkTheme()
    val window = activity.window

    // 监听深色模式和颜色变化,确保配置实时更新
    DisposableEffect(isDarkMode, statusBarColor, bottomBarColor) {
        val statusBarArgb = statusBarColor.toArgb()
        val bottomBarArgb = bottomBarColor.toArgb()

        window.enableEdgeToEdge(
            statusBarStyle = if (!isDarkMode) {
                SystemBarStyle.light(statusBarArgb, statusBarArgb)
            } else {
                SystemBarStyle.dark(statusBarArgb)
            },
            navigationBarStyle = if (!isDarkMode) {
                SystemBarStyle.light(bottomBarArgb, bottomBarArgb)
            } else {
                SystemBarStyle.dark(bottomBarArgb)
            }
        )

        onDispose {
            // 页面销毁时恢复默认系统栏样式
            window.disableEdgeToEdge()
        }
    }
}

2. 适配API35的Scaffold布局

Android15中navigationBarsPadding()的行为有微调,改用Scaffold内置的contentWindowInsets来处理系统栏内边距,确保BottomNavigation和系统导航栏的位置对齐:

CollegeSTheme {
    EdgeToEdgeConfig(
        this,
        bottomBarColor = MaterialTheme.colorScheme.surface
    )

    val navController = rememberNavController()
    val navigationInsets = WindowInsets.navigationBars

    Scaffold(
        modifier = Modifier.fillMaxSize(),
        bottomBar = {
            BottomNavigationBar(navController = navController)
        },
        // 直接传入导航栏Insets,让Scaffold自动处理内边距
        contentWindowInsets = navigationInsets
    ) { padding ->
        // 内容区域使用Scaffold提供的padding,避免被底部导航栏遮挡
        Box(modifier = Modifier.padding(padding)) {
            // 你的页面内容
        }
    }
}

3. 额外检查项

  • 确保Compose依赖版本适配API35,建议使用最新的Compose BOM(如2024.06.00),避免版本不兼容问题。
  • 验证Android15虚拟机的系统导航栏设置,确保没有启用特殊的手势模式或自定义样式干扰应用渲染。

内容的提问来源于stack exchange,提问作者oltry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:21:13