设置Tab宽度
参考自此文章
不过我使用customView时发现需要把原文中的
width = mTextView.getWidth();
去掉
修改后的方法如下(Kotlin):
/**
* 设置TabLayout的Tab宽度为某个view的宽度
*/
fun TabLayout.setTabWidthBy(fieldName: String) {
//了解源码得知 线的宽度是根据 tabView的宽度来设置的
post {
try {
//拿到tabLayout的mTabStrip属性
val mTabStripField = javaClass.getDeclaredField("mTabStrip")
mTabStripField.setAccessible(true)
val mTabStrip = mTabStripField.get(this) as LinearLayout
val dp10 = dip2px(context, 10f)
for (i in 0 until mTabStrip.childCount) {
val tabView = mTabStrip.getChildAt(i)
//拿到tabView的mView属性
val mViewField = tabView.javaClass.getDeclaredField(fieldName)
mViewField.isAccessible = true
val mView = mViewField.get(tabView) as View
tabView.setPadding(0, 0, 0, 0)
//因为我想要的效果是 字多宽线就多宽,所以测量mView的宽度
mView.measure(0, 0)
var width = mView.measuredWidth
//设置tab左右间距为10dp 注意这里不能使用Padding 因为源码中线的宽度是根据 tabView的宽度来设置的
val params = tabView.layoutParams as LinearLayout.LayoutParams
params.width = width
params.leftMargin = dp10
params.rightMargin = dp10
tabView.layoutParams = params
tabView.invalidate()
}
} catch (e: Exception) {
e.printStackTrace()
}
}
设置指示条宽度
安卓SDK原生Tablayout的指示条宽度和Tab的宽度一样,不支持修改(看了源码)。如果非要修改,可以使用其他替代库;
或者。。使个trick,把指示条放到Tab的customView的布局里,设置成selector类型的drawable就行了。
这个trick也是因为试了一些方案后觉得不合适才想到的~