官方API所支持的Indicator宽度分为两种,一种是以所有TabItem中最大的一个宽度为基准,另一种是每个TabItem根据文字宽度自适应,指定app:tabIndicatorFullWidth="false/true"
即可。
然而当我们需要把Indicator宽度设置为比TabItem文字更短的时候,搜索一番下来,都是千篇一律的利用反射或者copy官方源码自己修改,反射方案貌似并不是很好实现,而copy官方源码自定义,我也尝试了一下,涉及到的类非常多,工作量不小。
在坚持不使用第三方库的前提下,只是更改一个Indicator的样式而已,我觉得还能再抢救一下。最终还是发现有个非常简单且优雅的方案,那就是通过layer-list
图层为app:tabIndicator
属性指定一个自定义的drawable。
通过TabLayout源码我们也可以发现,TabLayout的Indicator是由SlidingTabIndicator负责绘制的,而SlidingTabIndicator继承自LinearLayout,内部是通过一个drawable来绘制Indicator的
给app:tabIndicator
设置的无论是什么样式,Indicator都是占满TabItem宽度的,所以我们可以在layer-list
里加一个居中的shape
,并指定宽高,就能够轻松实现对Indicator样式的自定义
Tips:单纯用
shape
是不行的,无法控制宽度
最终效果:
就是这么简单!
另外,这种方法只支持6.0及以上,在5.0和5.1无效,还是无法控制宽度