开发中遇到的问题:TabLayout自定义Tab宽度和下划线宽度,字体大小。
查找资料后总结如下:
一、更改tab 的字体。
使用属性app:tabTextAppearance
设置。
app:tabTextAppearance="@style/MyTabLayoutTextSize"
--------
<style name="MyTabLayoutTextSize" parent="TextAppearance.AppCompat.Widget.ActionBar.Title">
<item name="android:textSize">16spitem>
style>
记着加上parent属性
二、更改Tab宽度。
查看源码,使用反射。向大神学习:设置Tablayout的tab宽度
使用tablayout的对象在onstart()
生命周期中调用tablayout.post()
:
要在视图渲染后修改。
//了解源码得知 线的宽度是根据 tabView的宽度来设置的
tabLayout.post(() -> {
try {
//拿到tabLayout的mTabStrip属性
Field mTabStripField = tabLayout.getClass().getDeclaredField("mTabStrip");
mTabStripField.setAccessible(true);
LinearLayout mTabStrip = (LinearLayout) mTabStripField.get(tabLayout);
int dp10 = SM.dip2px(getContext(), 10);
for (int i = 0; i < mTabStrip.getChildCount(); i++) {
View tabView = mTabStrip.getChildAt(i);
//拿到tabView的mTextView属性
Field mTextViewField = tabView.getClass().getDeclaredField("mTextView");
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左右间距为10dp 注意这里不能使用Padding 因为源码中线的宽度是根据 tabView的宽度来设置的
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) tabView.getLayoutParams();
params.width = width ;
params.leftMargin = dp10;
params.rightMargin = dp10;
tabView.setLayoutParams(params);
tabView.invalidate();
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
});
三、设置下划线宽度:
也是要查看源码,然后反射修改属性。
/**
*参数leftdip, rightDip是设置tab左右的padding值,就是间距大小
*/
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, 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();
}
然后再onStart生命周期中:post()就行了。
tablayout.post(new Runnable(){
@Override
public void run() {
setIndicator (tablayout,10,10);
}
});