安卓8.0版本Google已经修改这个bug,添加:app:tabIndicatorFullWidth="false" 即可

安卓8.0以下的版本:

public class TabReflexUtil {public static void reflex(final SmartTabLayout tabLayout){//了解源码得知 线的宽度是根据 tabView的宽度来设置的tabLayout.post(new Runnable() {@Overridepublic void run() {try {//拿到tabLayout的mTabStrip属性Field mTabStripField = tabLayout.getClass().getDeclaredField("mTabStrip");mTabStripField.setAccessible(true);LinearLayout mTabStrip = (LinearLayout) mTabStripField.get(tabLayout);int dp10 = dip2px(tabLayout.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();}}});}public static void reflex(final TabLayout tabLayout){//了解源码得知 线的宽度是根据 tabView的宽度来设置的tabLayout.post(new Runnable() {@Overridepublic void run() {try {//拿到tabLayout的mTabStrip属性Field mTabStripField = tabLayout.getClass().getDeclaredField("mTabStrip");mTabStripField.setAccessible(true);LinearLayout mTabStrip = (LinearLayout) mTabStripField.get(tabLayout);int dp10 = dip2px(tabLayout.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();}}});}public static int dip2px(Context context, float dipValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dipValue * scale + 0.5f);}/*** 通过反射{@link TabLayout}设置下划线(Indicator)宽度,字多宽线就多宽,参阅 https://blog.csdn.net/waplyj/article/details/81068127*/public static void setTabLayoutIndicator(final TabLayout tabLayout) {//了解源码得知 线的宽度是根据 tabView的宽度来设置的tabLayout.post(new Runnable() {@Overridepublic void run() {try {Field field = tabLayout.getClass().getDeclaredField("mTabStrip");field.setAccessible(true);//拿到tabLayout的mTabStrip属性LinearLayout tabStrip = (LinearLayout) field.get(tabLayout);for (int i = 0, count = tabStrip.getChildCount(); i < count; i++) {View tabView = tabStrip.getChildAt(i);//拿到tabView的mTextView属性  tab的字数不固定一定用反射取mTextViewField mTextViewField = tabView.getClass().getDeclaredField("mTextView");mTextViewField.setAccessible(true);TextView textView = (TextView) mTextViewField.get(tabView);tabView.setPadding(0, 0, 0, 0);//因为我想要的效果是   字多宽线就多宽,所以测量mTextView的宽度int textWidth = 0;textWidth = textView.getWidth();if (textWidth == 0) {textView.measure(0, 0);textWidth = textView.getMeasuredWidth();}int tabWidth = 0;tabWidth = tabView.getWidth();if (tabWidth == 0) {tabView.measure(0, 0);tabWidth = tabView.getMeasuredWidth();}LinearLayout.LayoutParams tabViewParams = (LinearLayout.LayoutParams) tabView.getLayoutParams();int margin = (tabWidth - textWidth) / 2;//LogUtils.d("textWidth=" + textWidth + ", tabWidth=" + tabWidth + ", margin=" + margin);tabViewParams.leftMargin = margin;tabViewParams.rightMargin = margin;tabView.setLayoutParams(tabViewParams);}} catch (NoSuchFieldException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}});}public static void setTabLayoutIndicator(final SmartTabLayout tabLayout) {//了解源码得知 线的宽度是根据 tabView的宽度来设置的tabLayout.post(new Runnable() {@Overridepublic void run() {try {Field field = tabLayout.getClass().getDeclaredField("mTabStrip");field.setAccessible(true);//拿到tabLayout的mTabStrip属性LinearLayout tabStrip = (LinearLayout) field.get(tabLayout);for (int i = 0, count = tabStrip.getChildCount(); i < count; i++) {View tabView = tabStrip.getChildAt(i);//拿到tabView的mTextView属性  tab的字数不固定一定用反射取mTextViewField mTextViewField = tabView.getClass().getDeclaredField("mTextView");mTextViewField.setAccessible(true);TextView textView = (TextView) mTextViewField.get(tabView);tabView.setPadding(0, 0, 0, 0);//因为我想要的效果是   字多宽线就多宽,所以测量mTextView的宽度int textWidth = 0;textWidth = textView.getWidth();if (textWidth == 0) {textView.measure(0, 0);textWidth = textView.getMeasuredWidth();}int tabWidth = 0;tabWidth = tabView.getWidth();if (tabWidth == 0) {tabView.measure(0, 0);tabWidth = tabView.getMeasuredWidth();}LinearLayout.LayoutParams tabViewParams = (LinearLayout.LayoutParams) tabView.getLayoutParams();int margin = (tabWidth - textWidth) / 2;//LogUtils.d("textWidth=" + textWidth + ", tabWidth=" + tabWidth + ", margin=" + margin);tabViewParams.leftMargin = margin;tabViewParams.rightMargin = margin;tabView.setLayoutParams(tabViewParams);}} catch (NoSuchFieldException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}});}/*** 设置{@link TabLayout}的每项之间的分隔线*/public static void setTabLayoutDivider(TabLayout tabLayout) {setTabLayoutDivider(tabLayout, 12);}/*** 设置{@link TabLayout}的每项之间的分隔线*/public static void setTabLayoutDivider(TabLayout tabLayout, int paddingDip) {LinearLayout mTabStrip = (LinearLayout) tabLayout.getChildAt(0);mTabStrip.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);mTabStrip.setDividerPadding(dip2px(tabLayout.getContext(),paddingDip));
//        mTabStrip.setDividerDrawable(UIUtils.getDrawable(R.drawable.bg_big));}}
TabReflexUtil.reflex(tabLayout);即可

tablayout下划线长度相关推荐

  1. android自定义tab下划线变大,android设置tablayout下划线长度代码

    设置tablayout下划线长度的方法(android.support.design.widget.TabLayout) public static void setIndicator(Context ...

  2. 设置tablayout下划线长度

    随着字的宽而改变的 app:tabIndicatorFullWidth="false" 另一种: Xml 文件 <android.support.design.widget. ...

  3. Android 如何使Tablayout内容和下划线长度相同?

    我们在使用Tablayout选项卡控件的时候经常要根据项目需求做一些改动,比如如何使Tablayout内容和下划线长度相同,类似头条选项卡那种.通常我们的策略是通过反射的机制去改变Tabview的长度 ...

  4. TabLayout中的Tab.setCustomView左右有空隙,TabLayout下划线间隙设置,下划线长度设置

    间隙设置为零  因为当我们引入TabLayout时就已经默认tabPaddingStart为12dp,tabPaddingEnd为12dp.才会导致不能填满的原因,这时我们只需要修改样式或者属性即可. ...

  5. 关于 Android 中 TabLayout 下划线适配文字长度解析(附清晰详细的源码解析)

    温故而知新 坚持原创 请多多支持 一.问题背景 假期在做项目的时候,当时遇到了一个需求就是需要使用 TabLayout + ViewPager 来实现一个上部导航栏的动态效果,并且希望下划线的长度等于 ...

  6. php下划线长度如何改变,如何制作固定长度下划线(输入文字而长度不变)

    平时写报告少不了要制作封面.封面上一般有下划线,用来填写名字等信息.但是,平时一般人都是通过敲空格来控制下划线的长度,这样往往上下对不齐.并且在下划线上输入文字时,下划线长度就发生了变化.这样不仅费时 ...

  7. HTML中设定下划线样式并且指定下划线长度

    今天笔者在写网页导航栏时,想要给链接加一个悬停下划线,写出来如下 HTMl: <ul><li><a href="#">首页</a>& ...

  8. Tablayout动态设置下划线长度

    由于最近项目需要,需要设置tabLayout下方下划线的长度.笔者上网找了半天,也没有找到方法.后来了解到在源码中对tabLayout的下划线进行了设置.并没有方法可以直接设置. 然后,笔者看到了某位 ...

  9. CSS样式:实现字体带下划线,下划线长度自定义

    样式以及效果图: float: left:这个属性根据自己是否需要添加 <span style=" border-bottom: 1px solid black; height: 25 ...

最新文章

  1. C++ algorithm的sort函数总结
  2. Django学习(2)数据宝库
  3. UVA 315 :Network (无向图求割顶)
  4. SQL Server 索引重建或索引重組
  5. NetGear 夜鹰 RAX40V2 设备与固件分析
  6. 问题记录:如何比较两个字符串的相似度
  7. hdu4035 Maze 【期望dp + 数学】
  8. 操作系统实验报告14:Peterson 算法
  9. MCMC 和 Gibbs采样
  10. QEMU模拟vexpress-a9 搭建Linux kernel运行环境
  11. 设置element-iu中table滚动条位置
  12. 一款超好用的er图制作软件
  13. Redis常用命令(超详细整理)
  14. OpenCV静态编译配置基于小熊猫C++
  15. python抽奖教程_python实现抽奖小程序
  16. linux pbs 安装包,【Linux】单计算机安装PBS系统(Torque)与运维
  17. 未转变者服务器组队教程,未转变者联机服务器创建方法_未转变者 联机服务器怎么创建_快吧单机游戏...
  18. win10系统的应用商店不见了怎么安装回来
  19. 面试产品经理时如何回答“为什么想做产品经理”这个问题
  20. 联发科发布MT7986方案支持Wi-Fi 6/6E

热门文章

  1. 论文解读:利用结构隐代码的隐神经表示方法来合成动态人体的新颖视角
  2. PHP_JavaScript核心编程(1)
  3. 向smtp发送邮件失败
  4. 商家如何通过抖音带货?揭秘新手kol如何日带万单
  5. 垂杨光伏电站设计20KW分布式光伏电站设计案例
  6. 厦门羽燕食品有限公司受邀参加2022世界滋补产业生态大会暨品牌展示会
  7. 计算机主机上的接口的作用及名称,给大家及各位电脑小白们科普一下电脑主板各个接口的名称及作用...
  8. Tableau透视表入门
  9. YDOOK:Python3.9: breakpoint(*args, **kws) 函数:在调用时进入调试器中 详细用法
  10. 自学python三个月能做什么兼职_自学Python能干些什么副业