TabLayout在开发中时常用到,方便快捷,但美中不足的是TabLayout底部的导航条是定长的,没有直接设置的api,需要自己来进行改动,官方的建议是使用反射的方法来修改,下面看一段代码。
public static void setIndicator(TabLayout tabs, int leftDip, int rightDip) {
try {
Field tabStrip = tabs.getClass().getDeclaredField("mTabStrip");
tabStrip.setAccessible(true);
LinearLayout llTab = null;
llTab = (LinearLayout) tabStrip.get(tabs);
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();
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
}
}
在需要的地方,直接传入对应的参数就可以实现想要的效果。
ps:在使用这段代码的过程中,debug模式下没有问题,release下可能会在
tabStrip.setAccessible(true);
这句代码抛出空指针的异常,这是因为反射调用的support库被混淆了,只需要在混淆文件里加上
-keep class android.support.** {*;}