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