一直以來(lái)谷歌 design包都沒(méi)有對(duì)tablayout指示器長(zhǎng)度可變做兼容媚值,本人研究源碼得出兩種解決方法
1.復(fù)制Tablayout的源碼蝶涩,對(duì)其中繪制指示器的代碼做修改
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);
}
源生的繪制指示器已經(jīng)對(duì) 指示器高度做了兼容,始終沒(méi)有對(duì)長(zhǎng)度做兼容综液,遂順著谷歌的思路在draw這個(gè)方法里,將繪制指示器起始終點(diǎn)位置減去左右padding即可
默認(rèn)情況下,每個(gè)tab欄的weight都是1挟鸠,那么指示器也就是從0到1這么長(zhǎng),但是我們改變每個(gè)tab的左右margin亩冬,也能夠讓指示器繪制起始終止位置改變艘希,但這種方式有個(gè)問(wèn)題,指示器寬度不能小于文字寬度硅急,否則文字顯示不全覆享。
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();
}
下面奉獻(xiàn)上源代碼,傳送門(mén):https://github.com/mrme2014/MaterialTabLayout