在使用TabLayout的過程中,為每個標簽添加一個 下划線,但發現每個下划線的 寬度 都是一樣的,例如會如下顯示

這樣很難看,所以必須進行調整后的效果如下:

看,這樣不是非常和諧啦!~~
實現方法很簡單,只需要用反射重寫一些 TabLayout 就行!
我這里干脆做成了一個Util類 TabLayoutUtil .java ,代碼如下:
package com.jack.appnews.util; import android.support.design.widget.TabLayout; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import java.lang.reflect.Field; /** * TabLayoutUtil 工具類 */ public class TabLayoutUtil { public static void reflex(final TabLayout tabLayout) { //了解源碼得知 線的寬度是根據 tabView的寬度來設置的 tabLayout.post(new Runnable() { @Override public void run() { try { //拿到tabLayout的mTabStrip屬性 LinearLayout mTabStrip = (LinearLayout) tabLayout.getChildAt(0); int dp10 = UiUtil.dip2px(tabLayout.getContext(), 10); for (int i = 0; i < mTabStrip.getChildCount(); i++) { View tabView = mTabStrip.getChildAt(i); //拿到tabView的mTextView屬性 tab的字數不固定一定用反射取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(); } } }); } }
二、如何使用
在Activity 或者 BaseFragment 文件中,初始化完 TabLayout 后,
TabLayoutUtil.reflex(tabLayout);
private void bindData() { tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE); TabLayoutUtil.reflex(tabLayout); //修復 文本顯示寬度問題 }
