Android BottomNavigationView 完全自定义指南:图标、文字颜色与选中状态

1. 核心功能概述

通过 Material Design 的 BottomNavigationView,你可以轻松实现以下自定义:

✅ 动态切换选中/默认图标

✅ 自定义选中与默认文字颜色

✅ 控制文字显示模式(始终显示/仅选中显示/自动隐藏)

✅ 添加动画和高级样式调整

2. 图标自定义
方法 1:通过 Menu XML 指定不同状态图标

在 res/menu/bottom_nav_menu.xml 中直接定义:

复制代码
<item 
    android:id="@+id/nav_home"
    android:icon="@drawable/ic_home_default"  <!-- 默认图标 -->
    android:title="Home" />

代码中动态切换选中图标:

复制代码
bottomNavigationView.setOnNavigationItemSelectedListener { item ->
    when (item.itemId) {
        R.id.nav_home -> item.setIcon(R.drawable.ic_home_selected)
        R.id.nav_search -> item.setIcon(R.drawable.ic_search_selected)
        else -> false
    }
    true
}

方法 2:通过 Tint 自动着色(推荐)
创建颜色选择器 res/color/nav_icon_color_selector.xml:

复制代码
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="#FF0000" android:state_checked="true" />  <!-- 选中为红色 -->
    <item android:color="#9E9E9E" android:state_checked="false" /> <!-- 默认灰色 -->
</selector>

在布局中应用:

复制代码
<com.google.android.material.bottomnavigation.BottomNavigationView
    app:itemIconTint="@color/nav_icon_color_selector"
    ... />

3. 文字颜色自定义
步骤 1:创建文字颜色选择器
res/color/nav_text_color_selector.xml:

复制代码
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="#FF0000" android:state_checked="true" />  <!-- 选中红色 -->
    <item android:color="#60000000" android:state_checked="false" /> <!-- 默认半透明灰 -->
</selector>

步骤 2:绑定到 BottomNavigationView

复制代码
<com.google.android.material.bottomnavigation.BottomNavigationView
    app:itemTextColor="@color/nav_text_color_selector"
    app:labelVisibilityMode="labeled"  <!-- 仅选中显示文字 -->
    ... />

4. 控制文字显示模式

通过 labelVisibilityMode 调整文字显示行为:

模式值 效果
labeled 仅选中项显示文字
unlabeled 全部隐藏文字
auto 根据空间自动调整(默认)
示例代码:

复制代码
<com.google.android.material.bottomnavigation.BottomNavigationView
    app:labelVisibilityMode="labeled"
    ... />

5. 完整样式定制
自定义样式 (styles.xml)

复制代码
<style name="AppBottomNavigation" parent="Widget.MaterialComponents.BottomNavigationView">
    <item name="itemIconTint">@color/nav_icon_color_selector</item>
    <item name="itemTextColor">@color/nav_text_color_selector</item>
    <item name="itemIconSize">24dp</item>
    <item name="itemPaddingTop">6dp</item>
</style>

应用样式

复制代码
<com.google.android.material.bottomnavigation.BottomNavigationView
    style="@style/AppBottomNavigation"
    app:menu="@menu/bottom_nav_menu" />

6. 高级技巧
动态切换选中状态

复制代码
viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
    override fun onPageSelected(position: Int) {
        bottomNavigationView.menu.getItem(position).isChecked = true
    }
})

添加点击动画

复制代码
bottomNavigationView.setOnNavigationItemSelectedListener { item ->
    item.actionView?.apply {
        scaleX = 0.8f; scaleY = 0.8f
        animate().scaleX(1f).scaleY(1f).setDuration(200).start()
    }
    true
}

7. 注意事项
依赖版本 :确保使用 Material Components 1.3.0+:

复制代码
implementation 'com.google.android.material:material:1.6.0'

图标一致性 :所有图标建议使用相同尺寸(如 24x24dp)。
主题兼容:应用主题需继承 Theme.MaterialComponents。

通过以上方法,你可以完全掌控 BottomNavigationView 的视觉和交互行为,轻松实现设计需求!

相关推荐
_祝你今天愉快1 小时前
UI核心 - UI绘制流程及原理
android
mmsx1 小时前
Android 一个设备多个 App 抢:跨进程共享服务的架构设计
android·kotlin·app
mmsx1 小时前
Android GIS系列 栅格怎么存、格网怎么归算:两个容易混淆的 GIS 链路
android·性能优化·app
陈柒吖1 小时前
安卓代码加固(1):加密DEX
android·前端
mmsx1 小时前
Android GIS系列 串口、蓝牙、USB、网络:一套统一抽象怎么扛住四种通道
android·app·产品
二流小码农1 小时前
鸿蒙开发:ArrayList,可不会让UI更新哦
android·ios·harmonyos
hai_android1 小时前
深入理解 Java 的四种引用:强引用、软引用、弱引用、虚引用
android·kotlin·android jetpack
恋猫de小郭1 小时前
Flutter Golden Tests:给 AI Agent 的 UI 测试系统
android·前端·flutter
知昂七昂1 小时前
AOSP编译:敲下 `lunch xxx-userdebug`,你知道系统偷偷干了什么吗?
android
千里马学框架5 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation