[Android] TabLayout設置下划線(Indicator)寬度


在使用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); //修復 文本顯示寬度問題
}

 

本博客地址: wukong1688

本文原文地址:https://www.cnblogs.com/wukong1688/p/10760149.html

轉載請著名出處!謝謝~~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM