美文网首页
Android如何修改TabLayout中TabView的Pad

Android如何修改TabLayout中TabView的Pad

作者: 晖仔Milo | 来源:发表于2023-05-11 09:36 被阅读0次

前言:
近期,我们的业务方希望调整app首页TabLayout的间距,这个简单对吧, app:tabPaddingStart="12dp" + app:tabPaddingEnd="12dp" 就可以实现。

                <com.google.android.material.tabs.TabLayout
                    android:id="@+id/tabLayout"
                    android:layout_width="0dp"
                    android:layout_height="44dp"
                    app:tabMinWidth="30dp"
                    app:tabTextAppearance="@style/HomeTabText"
                    app:tabRippleColor="#EEF3F3"
                    app:tabMode="scrollable"
                    app:tabIndicatorHeight="3dp"
                    app:tabPaddingStart="12dp"
                    app:tabPaddingEnd="12dp"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintEnd_toStartOf="@+id/layout_all_series"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toTopOf="parent" />

没想到他们整幺蛾子,非要说第一个的paddingStart不要,需要左侧0边距。那怎么办呢?
主要思路有下
1、舍弃TabLayout,选择RecyclerView替代,因为RecyclerView可以使用ItemDecorcation可以灵活的调整间距。
2、app:tabPaddingStart="0dp" + app:tabPaddingEnd="0dp" ,使用 tab.setCustomView自带的间距;
3、查看源码,看下有没有能下手的地方。

方案优劣分析:
1、优点:灵活,可拓展性好;
劣势:替换组件,还要关联viewPager选中变化,工作量大。

2、优点:理论通顺,简单
缺点:实践时遇到问题,暂未解决。

3、优点:便捷
缺点:需要看源码,寻找可以修改的地方,有侵入性,未来SDK升级可能不能用。

1、2方案都可以自己尝试啊,我这里使用的第三种方案,利用反射动态修改了TabLayout中的paddingStart。具体代码如下。

public class FZHomeTabLayout extends TabLayout {

    private boolean mIsFirst = true;
    private int mTabPaddingStartRealValue;

    public FZHomeTabLayout(@NonNull Context context) {
        super(context);
    }

    public FZHomeTabLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public FZHomeTabLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @NonNull
    @Override
    public Tab newTab() {
        try {
            //设计需要第一个tab-paddingStart为0,只好这么干了
            Field field = getClass().getSuperclass().getDeclaredField("tabPaddingStart");
            field.setAccessible(true);
            if (mIsFirst) {
                mIsFirst = false;
                mTabPaddingStartRealValue = (Integer) field.get(this);
                field.set(this, 0);
            } else {
                field.set(this, mTabPaddingStartRealValue);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return super.newTab();
    }

}

相关文章

网友评论

      本文标题:Android如何修改TabLayout中TabView的Pad

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