- api 28以后 google对tablayout 新增了属性 :
app:tabIndicatorFullWidth="false" (适应标题宽度)
- api 28之前: 在Util工具类 中加入 下面方法:
/**
* 设置TabLayout线宽
*
* @param tabs
* @param leftDip 左边距
* @param rightDip 右边距
*/
public static void setTabLayoutIndicator(TabLayout tabs, int leftDip, int rightDip) {
if (tabs == null)
return;
Class<?> tabLayout = tabs.getClass();
Field tabStrip = null;
try {
//通过反射得到tablayout的下划线的Field
tabStrip = tabLayout.getDeclaredField("mTabStrip");
} catch (NoSuchFieldException e) {
e.printStackTrace();
return;
}
tabStrip.setAccessible(true);
LinearLayout llTab = null;
try {
//得到承载下划线的LinearLayout //源码可以看到SlidingTabStrip继承得到承载下划线的LinearLayout
llTab = (LinearLayout) tabStrip.get(tabs);
} catch (IllegalAccessException e) {
e.printStackTrace();
return;
}
int left = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, leftDip, Resources.getSystem().getDisplayMetrics());
int right = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, rightDip, Resources.getSystem().getDisplayMetrics());
//循环设置下划线的左边距和右边距
for (int i = 0; i < llTab.getChildCount(); i++) {
View child = llTab.getChildAt(i);
child.setPadding(0, 0, 0, 0);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1);
params.leftMargin = left;
params.rightMargin = right;
child.setLayoutParams(params);
child.invalidate();
}
}
2.tablayout 调用 :
tabLayout.post(() -> AtyUtils.setTabLayoutIndicator(tabLayout, 70, 70));
文章做总结学习笔记用,欢迎关注和点赞?!