一直以來谷歌 design包都沒有對tablayout指示器長度可變做兼容,本人研究源碼得出兩種解決方法
1.復制Tablayout的源碼,對其中繪制指示器的代碼做修改
2.利用反射
下面上圖
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
// Thick colored underline below the current selection
if(mIndicatorLeft>=0&&mIndicatorRight>mIndicatorLeft) {
canvas.drawRect(mIndicatorLeft+ getTabMargin(), getHeight() -mSelectedIndicatorHeight,
mIndicatorRight- getTabMargin(), getHeight(),mSelectedIndicatorPaint);
}
源生的繪制指示器已經對 指示器高度做了兼容,始終沒有對長度做兼容,遂順著谷歌的思路在draw這個方法里,將繪制指示器起始終點位置減去左右padding即可
默認情況下,每個tab欄的weight都是1,那么指示器也就是從0到1這么長,但是我們改變每個tab的左右margin,也能夠讓指示器繪制起始終止位置改變,但這種方式有個問題,指示器寬度不能小于文字寬度,否則文字顯示不全。
try{
Field mTabStrip =tableLayout.getClass().getDeclaredField("mTabStrip");
mTabStrip.setAccessible(true);
LinearLayout ltab = (LinearLayout) mTabStrip.get(tableLayout);
intchildCount = ltab.getChildCount();
for(inti =0; i < childCount; i++) {
View childAt = ltab.getChildAt(i);
LinearLayout.LayoutParams params =newLinearLayout.LayoutParams(0, -1);
params.weight=1;
params.leftMargin=20;
params.rightMargin=20;
childAt.setLayoutParams(params);
childAt.invalidate();
}
}catch(NoSuchFieldException e) {
e.printStackTrace();
}catch(IllegalAccessException e) {
e.printStackTrace();
}
下面奉獻上源代碼,傳送門:https://github.com/mrme2014/MaterialTabLayout