在使用tablayout 中 需要修改文字下方的指示器宽度
实际中原生tablayout 是没有相关对外方法实现修改功能的我们需要用到反射处理
保证tablayout 可以使用为前提 在使用后加入下方代码
mTabTl.post(newRunnable() {
@Override
public voidrun() {
setIndicator(mTabTl,60,60);
}
});
private voidsetIndicator(TabLayout tabs, intleftDp, intrightDp) {
Class tabLayout = tabs.getClass();
Field tabStrip =null;
try{
//拿到我们需要修改的属性值 名字只能是这个
tabStrip = tabLayout.getDeclaredField("mTabStrip");
}catch(NoSuchFieldException e) {
e.printStackTrace();
}
tabStrip.setAccessible(true);
LinearLayout llTab =null;
try{
/ /获取到我们需要的tablayout
llTab = (LinearLayout) tabStrip.get(tabs);
}catch(IllegalAccessException e) {
e.printStackTrace();
}
//转换调整数值
intleft = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,leftDp,Resources.getSystem().getDisplayMetrics());
intright = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,rightDp,Resources.getSystem().getDisplayMetrics());
for(inti =0;i < llTab.getChildCount();i++) {
View child = llTab.getChildAt(i);
child.setPadding(0,0,0,0);
//最终的方法还是使用代码动态的修改属性值
LinearLayout.LayoutParams params=newLinearLayout.LayoutParams(
0,LinearLayout.LayoutParams.MATCH_PARENT,1);
params.leftMargin= left;
params.rightMargin= right;
child.setLayoutParams(params);
child.invalidate();
}
}
简单来说就是拿到关键属性动态修改值 但是还不知道适配情况怎么样
介绍完毕 需要更专业理解的请查阅如下资料
http://www.jianshu.com/p/581e4ea600f9