Jetpack Compose从API34迁移至API35后导航栏显示异常问题
问题核心
从API34升级到API35后,Android15虚拟机里应用底部导航栏的系统样式渲染异常,本质是两个问题:
- 代码中错误地用
Color.hashCode()转换颜色值,这和颜色的ARGB值完全不是一回事,API34可能兼容了这种错误,但API35的系统导航栏处理逻辑更严格,导致颜色失效。 - 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
相关产品推荐
相关产品推荐

