关于 Material Design 相关的控件,之前整理了一个系列文章,并建立一个 MDSamples 工程,使用代码和文字解说配合的方式逐一说明。截止目前,大致写有八九篇文章。期间,由于一些工作变动和琐事,停了一些时间。现在,有点时间,准备续上。
之前的文章,参考列表如下:
- Android TabLayout 分分钟打造一个滑动标签页
- Android 一文告诉你到底是用Dialog,Snackbar,还是Toast
- Android FloatingActionButton 重要的操作不要太多,一个就好
- Android 初识AppBarLayout 和 CoordinatorLayout
- Android CoordinatorLayout实战案例学习《一》
- Android CoordinatorLayout 实战案例学习《二》
- Android 详细分析AppBarLayout的五种ScrollFlags
- Android TextInputLayout,打造 Material Design 风格的文本输入框
这一篇要说的是 Android App 中的 BottomNavigation 设计,底部导航栏,设计规范可参考官网:
Material Design Components 之 Bottom Navigation
support.design 包中对应提供的控件是 BottomNavigationView,提供不多于 5 个菜单的底部导航栏实现。
我们先来看一下基本使用:
|
|
使用 menu 资源定义菜单内容,也就是这里的 res/menu/menu_bottom_navigation.xml 文件:
|
|
除了 app:menu 属性定义菜单内容,BottomNavigationView 能够使用的定制属性并不多,有这几个:
app:itemIconTint:Icon 图标着色,值为一个 ColorStateList ,可以在 color 资源文件夹中定义。使用这个属性,奇妙利用 tint 着色器实现一个图标多种状态下使用。:
|
|
app:itemTextColor:Label 文字颜色定义。
app:itemBackground:背景内容。
效果如下:
上图是 3 个菜单时的展示和交互方式,即菜单文字和图标同时显示,选中时有一个大小变化过程(这里不是动画,通过源码可以看到,其实只是一个简单的尺寸上的瞬时缩放)。但是,当超过 3 个菜单时,文字就不再显示。对比看一下 5 个菜单时的效果图:
可以看到,交互方式也发生变化,选中有一个左右移动腾出空间的过程。那再多一点菜单数量,比如 6 个时呢?对不起,要报错啦,不支持!
注意:根据 Material Design 对底部导航栏的设计要求,BottomNavigationView 只支持 3 到 5 个子菜单数量的导航栏。并且,考虑到用户体验,3 个及3个以下菜单数量的导航栏,与超过 3 个时,交互过程也有所区分。关于最多支持 5 个字菜单的内容,可以从 BottomNavigationView 源码中查看:
public static final int MAX_ITEM_COUNT = 5;
当超出这个数量时,产生非法参数异常。
通过 setOnNavigationItemSelectedListener() 方法可以监听不同子菜单的选中切换事件。但是,竟然没有一个简便的方法直接设置选中某个子菜单,就像 check(id) 这样。不知是不是 BottomNavigationView 控件设计时的遗漏。目前能够想到的一个做法就是获取 menu item 对象,利用 performClick() 模拟点击事件,如:
|
|
以上便是 BottomNavigationView 的所有内容,按照 Android 上的 Bottom Navigation 设计规范定制而成。可以看出,使用起来还是很简单的。同时,可定制性也非常有限。比如,想在底部某个子菜单添加一个小红点提示的视图,就有些难以处理。如果使用 RadioGroup 实现导航栏的话,就灵活一些。
附:GitHub 站有两个开源项目: BottomNavigationBar 和BottomNavigationViewEx,专门针对 Material Design 风格的 Bottom Navigation 量身定制的,可供参考。