Tablayout 指示器宽度调整

作者: 爱吃糖的先生 | 来源:发表于2017-09-01 15:02 被阅读0次

    在使用tablayout 中 需要修改文字下方的指示器宽度

    实际中原生tablayout 是没有相关对外方法实现修改功能的我们需要用到反射处理

    保证tablayout 可以使用为前提 在使用后加入下方代码

    mTabTl.post(newRunnable() {

            @Override

           public voidrun() {

                  setIndicator(mTabTl,60,60);

          }

    });

    private voidsetIndicator(TabLayout tabs, intleftDp, intrightDp) {

             Class tabLayout = tabs.getClass();

             Field tabStrip =null;

             try{

                 //拿到我们需要修改的属性值 名字只能是这个

                  tabStrip = tabLayout.getDeclaredField("mTabStrip");

             }catch(NoSuchFieldException e) {

                 e.printStackTrace();

    }

           tabStrip.setAccessible(true);

           LinearLayout llTab =null;

           try{

              / /获取到我们需要的tablayout 

                llTab = (LinearLayout) tabStrip.get(tabs);

           }catch(IllegalAccessException e) {

                 e.printStackTrace();

           }

    //转换调整数值

    intleft = (int) TypedValue.applyDimension(

               TypedValue.COMPLEX_UNIT_DIP,leftDp,Resources.getSystem().getDisplayMetrics());

         intright = (int) TypedValue.applyDimension(

               TypedValue.COMPLEX_UNIT_DIP,rightDp,Resources.getSystem().getDisplayMetrics());

         for(inti =0;i < llTab.getChildCount();i++) {

              View child = llTab.getChildAt(i);

              child.setPadding(0,0,0,0);

            //最终的方法还是使用代码动态的修改属性值

             LinearLayout.LayoutParams params=newLinearLayout.LayoutParams(

                              0,LinearLayout.LayoutParams.MATCH_PARENT,1);

              params.leftMargin= left;

              params.rightMargin= right;

              child.setLayoutParams(params);

              child.invalidate();

    }

    }

    简单来说就是拿到关键属性动态修改值 但是还不知道适配情况怎么样

    介绍完毕 需要更专业理解的请查阅如下资料

    http://www.jianshu.com/p/581e4ea600f9

    相关文章

      网友评论

        本文标题:Tablayout 指示器宽度调整

        本文链接:https://www.haomeiwen.com/subject/ypxodxtx.html