本身tablout 不能设置indicator线的长度,要用反射 来设置 重点Api 28 以下 Field mTextViewField= tabView.getClass().getDeclaredField("mTextView");
以上Field mTextViewField= tabView.getClass().getDeclaredField("textView");
public void setIndicatorWidth(final TabLayout tabLayout){//从源码得知 线的宽度是根据 tabView的宽度来设置的
tabLayout.post(new Runnable() {@Override
public void run() {try {//拿到tabLayout的mTabStrip属性
LinearLayout mTabStrip= (LinearLayout)tabLayout.getChildAt(0);
//将dp转换成px
int dp10= DisPlayUtils.dip2px(tabLayout.getContext(), 10);
for (int i=0; i< mTabStrip.getChildCount(); i++) {View tabView= mTabStrip.getChildAt(i);
//拿到tabView的mTextView属性 tab的字数不固定一定用反射取mTextView 在API28下记得改为:tabLayout.getDeclaredField("textView");
Field mTextViewField= tabView.getClass().getDeclaredField("textView");
mTextViewField.setAccessible(true);
TextView mTextView= (TextView) mTextViewField.get(tabView);
tabView.setPadding(0, 0, 0, 0);
//想要的效果是 字多宽线就多宽,所以测量mTextView的宽度
int width=0;
width= mTextView.getWidth();
if (width==0) {mTextView.measure(0, 0);
width= mTextView.getMeasuredWidth();
}//设置tab左右间距 ,因为源码中线的宽度是根据tabView的宽度来设置的,所以得注意这里不能使用Padding
LinearLayout.LayoutParams params= (LinearLayout.LayoutParams) tabView.getLayoutParams();
//指示器宽度值设置
params.width = width+20; //由于选中字体变大 所以额外 加20 的 宽度
//设置一下tabview的margin,不设置会连在一起
params.leftMargin = dp10;
params.rightMargin = dp10;
tabView.setLayoutParams(params);
tabView.invalidate();
}}catch (NoSuchFieldException e) {
e.printStackTrace();
}catch (IllegalAccessException e) {e.printStackTrace();
}}});}