通过修改指示器的间距来改变TabLayout指示器的宽度

来源:互联网 发布:skype6.6mac官方下载 编辑:程序博客网 时间:2024/05/22 17:00

1.写个工具类 封装:

import android.content.res.Resources;import android.support.design.widget.TabLayout;import android.util.TypedValue;import android.view.View;import android.widget.LinearLayout;import java.lang.reflect.Field;/** * Created by Sy on 2017/05/08. *  */public class TabUtils {    /**    *  @param tabs TabLayout     * @param leftDip marginLeft     * @param rightDip marginRight    */    public static void setIndicator (TabLayout tabs, int leftDip, int rightDip){        Class<?> tabLayout = tabs.getClass();        Field tabStrip = null;        try {            tabStrip = tabLayout.getDeclaredField("mTabStrip");        } catch (NoSuchFieldException e) {            e.printStackTrace();            return;        }        tabStrip.setAccessible(true);        LinearLayout llTab = null;        try {            llTab = (LinearLayout) tabStrip.get(tabs);        } catch (IllegalAccessException e) {            e.printStackTrace();
         return;        }        int left = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, leftDip, Resources.getSystem().getDisplayMetrics());        int right = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, rightDip, Resources.getSystem().getDisplayMetrics());        for (int i = 0; i < llTab.getChildCount(); i++) {            View child = llTab.getChildAt(i);            child.setPadding(0, 0, 0, 0);            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1);            params.leftMargin = left;            params.rightMargin = right;            child.setLayoutParams(params);            child.invalidate();        }    }}


2.在Activity调用

tab_view.post(new Runnable() {    @Override    public void run() {        TabUtils.setIndicator(tab_view,10,10);    }});
3,此方法是通过反射获取tablayout私有属性进修改属性值,如果app启动混淆 会报NoSuchFieldException;

解决方案:在proguard-rules.pro混淆文件中添加-keep class android.support.design.widget.TabLayout{*;}

原创粉丝点击