TabLayout 设置指示器宽度问题

public static void setTabLayoutWidth(int left, int right, TabLayout tabLayout, Activity Activity) {
    try {
        Field slidingTabIndicatorField;
        Field textViewField;
        // 拿到tabLayout的slidingTabIndicator属性
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            slidingTabIndicatorField = tabLayout.getClass().getDeclaredField("slidingTabIndicator");

        } else {
            slidingTabIndicatorField = tabLayout.getClass().getDeclaredField("mTabStrip");
        }

        slidingTabIndicatorField.setAccessible(true);
        LinearLayout mTabStrip = (LinearLayout) slidingTabIndicatorField.get(tabLayout);
        for (int i = 0; i < mTabStrip.getChildCount(); i++) {
            View tabView = mTabStrip.getChildAt(i);
            //拿到tabView的mTextView属性
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                textViewField = tabView.getClass().getDeclaredField("textView");
            } else {
                textViewField = tabLayout.getClass().getDeclaredField("mTextView");
            }
            textViewField.setAccessible(true);
            TextView mTextView = (TextView) textViewField.get(tabView);
            tabView.setPadding(0, 0, 0, 0);
            // 因为想要的效果是字多宽线就多宽,所以测量mTextView的宽度
            int width = mTextView.getWidth();
            if (width == 0) {
                mTextView.measure(0, 0);
                width = mTextView.getMeasuredWidth();
            }
            // 设置tab左右间距,注意这里不能使用Padding,因为源码中线的宽度是根据tabView的宽度来设置的
            LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) tabView.getLayoutParams();
            params.width = width;
            params.leftMargin = left;
            params.rightMargin = right;
            tabView.setLayoutParams(params);
            tabView.invalidate();
        }
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

}
app:tabIndicatorFullWidth="false"设置为false 就是指示线跟tabitem的文字一样宽 

要设置为true 才能设置上边的才有效

有同学肯定好奇为啥上边还有版本判断

因为sdk大于等于28 是 slidingTabIndicator这个 小于的就是  mTabStrip  因为sdk版本都有差异 找不到的话 就会 Exception

然后就尴尬了

如果这个不能满足你的需求  建议看下这个TabLayout

传送门

这是根据我日常遇到的问题分享出来 希望能解决各位同学的问题 不许勿喷!白白

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我想吃辣条

觉得不错,就可怜可怜博主吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值