更改Tab下划线的宽度

来源:互联网 发布:股票交易数据下载 编辑:程序博客网 时间:2024/05/29 12:25
通过反射更改下划线的宽度
public static void setIndicator(final TabLayout tabLayout){    tabLayout.post(new Runnable() {        @Override        public void run() {            try {                //拿到tabLayout的mTabStrip属性                LinearLayout mTabStrip = (LinearLayout) tabLayout.getChildAt(0);                //tab 的左右边距                int dp = CompanyUtil.dip2px(tabLayout.getContext(), 20);                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 = dp;                    params.rightMargin = dp;                    tabView.setLayoutParams(params);                    tabView.invalidate();                }            } catch (NoSuchFieldException e) {                e.printStackTrace();            } catch (IllegalAccessException e) {                e.printStackTrace();            }        }    });}