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

Android Kotlin如何自定义Material Theme 3的NavigationBarItemColors

Material Theme 3自定义底部导航栏项颜色解决方案

问题说明

尝试修改Material Theme 3底部导航栏项颜色时,直接实例化NavigationBarItemColors会报错:

val myNavigationBarItemColors: NavigationBarItemColors = NavigationBarItemColors(
// 报错:Cannot access '<init>': it is internal in 'NavigationBarItemColors'
)

原因是NavigationBarItemColors的构造函数被标记为internal,无法直接创建实例,必须使用官方提供的合法API来自定义颜色。


解决方法

1. 使用官方构建器函数navigationBarItemColors()

这是最直接的方式,通过顶层构建器函数创建NavigationBarItemColors实例,自定义选中/未选中状态的图标、文本及指示器颜色:

val customNavItemColors = navigationBarItemColors(
    selectedIconColor = Color(0xFFD32F2F), // 选中态图标颜色
    selectedTextColor = Color(0xFFD32F2F), // 选中态文本颜色
    unselectedIconColor = Color(0xFF757575), // 未选中态图标颜色
    unselectedTextColor = Color(0xFF757575), // 未选中态文本颜色
    indicatorColor = Color(0x20D32F2F) // 选中项背景指示器颜色
)

// 在NavigationBar中使用
NavigationBar(
    itemColors = customNavItemColors,
    modifier = Modifier.fillMaxWidth()
) {
    NavigationBarItem(
        selected = selectedTab == 0,
        onClick = { selectedTab = 0 },
        icon = { Icon(Icons.Filled.Home, contentDescription = "首页") },
        label = { Text("首页") }
    )
    // 其他导航项...
}

2. 全局主题中统一配置

如果希望整个App的导航栏颜色风格统一,可以在自定义Material Theme中基于主题色配置导航栏项颜色:

// 自定义颜色方案
private val AppDarkColorScheme = darkColorScheme(
    primary = Color(0xFFD32F2F),
    onPrimary = Color.White,
    surfaceVariant = Color(0xFF424242),
    onSurfaceVariant = Color(0xFFEEEEEE)
)

@Composable
fun AppTheme(
    darkTheme: Boolean = isSystemInDarkTheme(),
    content: @Composable () -> Unit
) {
    val colorScheme = if (darkTheme) AppDarkColorScheme else lightColorScheme()
    MaterialTheme(
        colorScheme = colorScheme,
        typography = Typography,
        shapes = Shapes,
        content = content
    )
}

// 使用主题色配置导航栏
NavigationBar(
    itemColors = navigationBarItemColors(
        selectedIconColor = MaterialTheme.colorScheme.primary,
        selectedTextColor = MaterialTheme.colorScheme.primary,
        unselectedIconColor = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.6f),
        unselectedTextColor = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.6f)
    )
) {
    // 导航项...
}

3. 单独配置单个导航项

如果需要给特定导航项设置差异化颜色,可以直接在NavigationBarItem中覆盖颜色参数:

NavigationBarItem(
    selected = selectedTab == 1,
    onClick = { selectedTab = 1 },
    icon = { Icon(Icons.Filled.Favorite, contentDescription = "收藏") },
    label = { Text("收藏") },
    selectedIconColor = Color(0xFFE91E63),
    unselectedIconColor = Color(0xFFBDBDBD),
    selectedTextColor = Color(0xFFE91E63),
    unselectedTextColor = Color(0xFFBDBDBD)
)

内容的提问来源于stack exchange,提问作者Basil the dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:15:20