Android-TabLayout-动态设置TabItem的背景Shape.有坑.......
坑1: TabItem添加id属性,然后用注解绑定,发现找不到,卧槽。。。如下不要去找那个item。用tablayout去动态获取。
<android.support.design.widget.TabLayout
android:id="@+id/fkg_tableyout"
android:layout_width="match_parent"
android:layout_height="32dp"
app:elevation="0dp"
app:layout_constraintTop_toTopOf="parent"
app:tabGravity="center"
app:tabIndicatorHeight="0dp"
app:tabMode="fixed"
app:tabPaddingEnd="16dp"
app:tabPaddingStart="24dp"
app:tabSelectedTextColor="@color/green_all_bg"
app:tabTextAppearance="@style/MyCustomTextAppearance2"
app:tabTextColor="@color/white">
<android.support.design.widget.TabItem
android:id="@+id/dfdsf"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="知识库" />
<android.support.design.widget.TabItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="新闻资讯" />
</android.support.design.widget.TabLayout>
坑2 - 这是我的方式,目前测试没有问题: 循环获取fkg_tableyout.getTabCount()的时候,不要直接在UI线程里面,太早了。虽然可以获取到,但是此时tab位置不确定,你如果靠第几个去设置背景,容易出问题。所以建议延迟获取,或者如下:
HashMap<Integer, TabLayout.Tab> tabList = new HashMap<>();
fkg_tableyout.addOnTabSelectedListener(new TabLayout.BaseOnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
// 这里才是加载完后获取对应位置的数据,不然会错位的
if (tabList.size() <= 0) {
for (int i = 0; i < fkg_tableyout.getTabCount(); ++i) {
tabList.put(fkg_tableyout.getTabAt(i).getPosition(), fkg_tableyout.getTabAt(i));
}
}
if (0 == tab.getPosition()) {
ViewCompat.setBackground(tabList.get(0).view, mContext.getResources().getDrawable(R.drawable.tab_green_stroke_solid_white_shape));
ViewCompat.setBackground(tabList.get(1).view, mContext.getResources().getDrawable(R.drawable.tab_green_stroke_solid_green_shape));
} else {
ViewCompat.setBackground(tabList.get(0).view, mContext.getResources().getDrawable(R.drawable.tab_green_stroke_solid_green_shape2));
ViewCompat.setBackground(tabList.get(1).view, mContext.getResources().getDrawable(R.drawable.tab_green_stroke_solid_white_shape2));
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
3. 建议最好还是动态创建Tab,然后添加,那样比较靠谱。。 网上有类似动态修改的方式,你可以参考,遇到问题,多调试吧。。我也是折腾了一久。。。\
这是Tablayout的配置。。。
<!--app:tabBackground="@drawable/tab_selector"-->
<android.support.design.widget.TabLayout
android:id="@+id/fkg_tableyout"
android:layout_width="match_parent"
android:layout_height="32dp"
app:elevation="0dp"
app:layout_constraintTop_toTopOf="parent"
app:tabGravity="center"
app:tabIndicatorHeight="0dp"
app:tabMode="fixed"
app:tabPaddingEnd="16dp"
app:tabPaddingStart="24dp"
app:tabSelectedTextColor="@color/green_all_bg"
app:tabTextAppearance="@style/MyCustomTextAppearance2"
app:tabTextColor="@color/white">
<android.support.design.widget.TabItem
android:layout_width="wrap_content"
android:id="@+id/dfdsf"
android:layout_height="wrap_content"
android:text="知识库" />
<android.support.design.widget.TabItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="新闻资讯" />
</android.support.design.widget.TabLayout>
效果:
我之前都是动态创建的,哈哈。。这次尝试了不太一样的方式.......喵....
发布于 2020-04-02 14:29