其实我们大多时候是这两个需求,一个自带的属性就搞定,还有就是自定义(根据TabLayout的版本来决定写法)
1.app:tabIndicatorFullWidth="false",ture是第一个红箭头,false是第二个。
想要修改指示器的样式,直接在代码中修改:
tabThree.setSelectedTabIndicator(getResources().getDrawable(R.drawable.line));
2.下面是自定义的写法的一种:
下面是activity中的写法:
public void setIndicator(TabLayout tabs, int leftDip, int rightDip) {
Class<?> tabLayout = tabs.getClass();
Field tabStrip = null;
try {
tabStrip = tabLayout.getDeclaredField("mTabStrip");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
tabStrip.setAccessible(true);
LinearLayout llTab = null;
try {
llTab = (LinearLayout) tabStrip.get(tabs);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
int left = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip2px(leftDip), Resources.getSystem().getDisplayMetrics());
int right = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip2px(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();
}
}
/**
* dp转px
**/
public int dip2px(int dipValue) {
float reSize = getActivity().getResources().getDisplayMetrics().density;
return (int) ((dipValue * reSize) + 0.5);
}
调用方法:
tabLive.post(new Runnable() {
@Override
public void run() {
// setIndicator(tabLive,5,5);
// SetIndicator.setIndicator(tabLive,5,5);
}
});
下面是封装的类:
import android.content.res.Resources;
import android.support.design.widget.TabLayout;
import android.util.TypedValue;
import android.view.View;
import android.widget.LinearLayout;
import java.lang.reflect.Field;
import static com.southsummer.goddessplan.utils.AppUtils.getResources;
/**
* tabLayout设置指示器长度
*/
public class SetIndicator {
public static void setIndicator(TabLayout tabs, int leftDip, int rightDip) {
Class<?> tabLayout = tabs.getClass();
Field tabStrip = null;
try {
tabStrip = tabLayout.getDeclaredField("mTabStrip");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
tabStrip.setAccessible(true);
LinearLayout llTab = null;
try {
llTab = (LinearLayout) tabStrip.get(tabs);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
int left = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip2px(leftDip), Resources.getSystem().getDisplayMetrics());
int right = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip2px(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();
}
}
/**
* dp转px
**/
public static int dip2px(int dipValue) {
float reSize = getResources().getDisplayMetrics().density;
return (int) ((dipValue * reSize) + 0.5);
}
}