设置tablayout下划线的宽度 (TabLayout和28之前有差异,mTabStrip已经是slidingTabIndicator了,API 28下TabLayout的差异)

两种实现方式

 /**     * 设置tablayout下划线的宽度     */    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 = dp2px(50);                    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();                }            }        });    }



   public static void setIndicatorWidth(@NonNull final TabLayout tabLayout, final int margin) {       tabLayout.post(new Runnable() {           @Override public void run() {               try {                   // 拿到tabLayout的slidingTabIndicator属性                   Field slidingTabIndicatorField = tabLayout.getClass().getDeclaredField("slidingTabIndicator");                   slidingTabIndicatorField.setAccessible(true);                   LinearLayout mTabStrip = (LinearLayout) slidingTabIndicatorField.get(tabLayout);                   for (int i = 0; i < mTabStrip.getChildCount(); i++) { View tabView = mTabStrip.getChildAt(i);                       //拿到tabView的mTextView属性                       Field textViewField = tabView.getClass().getDeclaredField("textView");                       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 = margin; params.rightMargin = margin;                       tabView.setLayoutParams(params); tabView.invalidate();                   }               } catch (NoSuchFieldException e) {                   e.printStackTrace();               } catch (IllegalAccessException e) {                   e.printStackTrace();               }           }       });   }

原简书博文,现迁至这

更多相关文章

  1. 设置布局默认为LinearLayout,却成了RelativeLayout
  2. Android(安卓)Studio的下载、安装与配置
  3. 一步一步学android之布局管理器——LinearLayout
  4. Android:TextView显示富文本信息
  5. android Activity窗体显示状态设置
  6. Android中WebView使用解析
  7. Android(安卓)MediaRecorder录制音频的方法
  8. 代码实现android的一个登录界面
  9. Android使用高德地图地理围栏定位自动发送短信

随机推荐

  1. 屏幕适配备忘录
  2. 网页加速之Link prefetching
  3. [WebView学习之二]:使用Web Apps 支持不
  4. Android(安卓)菜单和对话框等
  5. Android(安卓)SimpleArrayMap源码解析
  6. Android(安卓)在低版本sdk中没有getSuppo
  7. 《老罗Android》监听电量变化、Broadcast
  8. Android(安卓)架构组件之 Lifecycle 使用
  9. Java Nested class
  10. [Android][AlarmManager]