TabLayout tabMode="scrollable" 时,修改tab的宽度

使用TabLayout,但是 tabMode="scrollable" 时,两个tab之间的间距太开了,实在不美观,看TabLayout源码,原来是设置了最小间距导致的:

this.scrollableTabMinWidth = res.getDimensionPixelSize(dimen.design_tab_scrollable_min_width);
<dimen name="design_tab_scrollable_min_width">72dp</dimen>

ui工程师要求是47dp,于是通过反射的方法改变这个值就可以了:

public class MyTabLayout extends TabLayout {
    // 一屏显示多少个tab
    private static final int TabViewNumber = 8;
    // support 低版本可能不一样
    private static final String SCROLLABLE_TAB_MIN_WIDTH = "scrollableTabMinWidth";

    public MyTabLayout(Context context) {
        super(context);
        initTabMinWidth();
    }

    public MyTabLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        initTabMinWidth();
    }

    public MyTabLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initTabMinWidth();
    }

    private void initTabMinWidth() {
//        int screenWidth = getResources().getDisplayMetrics().widthPixels;
//        int tabMinWidth = screenWidth / TabViewNumber;
        // scrollable模式时,tab的最小宽度
        int tabMinWidth = (int) getResources().getDimension(R.dimen.dp_47);

        Field field;
        try {
            field = TabLayout.class.getDeclaredField(SCROLLABLE_TAB_MIN_WIDTH);
            field.setAccessible(true);
            field.set(this, tabMinWidth);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

注意:

  • 这里是基于com.android.support:design:28.0.0,低版本字段名可能不一样
  • 注意添加混淆
## 不混淆 TabLayout 
-keepclasseswithmembernames class android.support.design.widget.TabLayout {
    *;
}

参考资料:https://blog.csdn.net/wanglaohushiwo/article/details/72857691

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • TabLayout在清单文件的属性设置: android.support.design:tabIndicatorC...
    雨灬纷灬飞阅读 14,079评论 0 6
  • 一、简述 TabLayout是Android Support Design库的新控件,可以用来实现开源框架View...
    CQ_TYL阅读 5,654评论 0 5
  • TabLayout是属于容器控件, 提供水平显示Tab的效果. 常常和ViewPager配合使用. 我将全面地讲解...
    随心随性_0a25阅读 4,933评论 0 2
  • 1、需求 TabLayout+Viewpager+Fragment,在tab中显示一个红点,用来标识是否有新消息未...
    陈晓松快点跑阅读 11,242评论 0 1
  • 咏鹅 诗 骆宾王 曲 梁俊 唱 夏初 梁俊 鹅鹅鹅,曲项向天歌。 白毛浮绿水,红掌拨清波。
    梁俊唱古诗阅读 4,553评论 1 10