前言:
近期,我们的业务方希望调整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();
}
}
网友评论