美文网首页
TabLayout的使用

TabLayout的使用

作者: dlihasa | 来源:发表于2018-09-12 16:39 被阅读13次

    在项目里使用TabLayout+ViewPager+Fragment来实现项目功能,本文主要记录一下使用TabLayout过程中出现的一些问题。

    一开始我的页面tab是固定的,寻思着在布局文件中直接写进去吧,像这样:

    <android.support.design.widget.TabLayout
            android:id="@+id/tabLayout"
            android:layout_width="match_parent"
            android:layout_height="@dimen/dimen150"
            android:background="@color/white"
            android:fillViewport="false"
            app:tabMode="fixed"
            app:layout_scrollFlags="scroll"
            app:tabIndicatorColor="@color/blue_bottom"
            app:tabIndicatorHeight="@dimen/dimen8"
            app:tabTextAppearance="@style/MyTabText"
            app:tabTextColor="@color/black"
            app:tabSelectedTextColor="@color/blue_bottom">
            <android.support.design.widget.TabItem
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:text="账号密码登录"/>
            <android.support.design.widget.TabItem
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:text="手机号快捷登录"/>
        </android.support.design.widget.TabLayout>
    

    里面代码设置了各种tab的样式,指示器的颜色和高度、tab的高度、tab中字体选中与未选中的颜色、style中设置了tab字体的大小(因为没有直接设置tab字体大小的属性),还放入了固定的两个TabItem。

    然后呢,在代码里面动态的修改了TabLayout的一些样式,比如指示器的宽度,在TabItem之间增加了竖线

    LinearLayout linearLayout = (LinearLayout) tabLayout.getChildAt(0);
    linearLayout.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);
    linearLayout.setDividerDrawable(ContextCompat.getDrawable(this, R.drawable.tab_divider));
    linearLayout.setDividerPadding(30);
    TabLayoutUtil.setIndicator(this,tabLayout,80,80);
    
    6331545-771d7c1f31aff4e3.png

    高高兴兴的设置了这些之后,就是这样了,嗯,效果出来了。但是,你做足了样子,得做事情啊,代码如下:

    List<Fragment> fragmentList = new ArrayList<>();
    fragmentList.add(LoginWithPwdFragment.newInstance());
    fragmentList.add(LoginWithCodeFragment.newInstance());
    ABaseFragmentAdapter adapter = new ABaseFragmentAdapter(getSupportFragmentManager(),fragmentList);
    vp.setAdapter(adapter);
    tabLayout.setupWithViewPager(vp);//会调用removeAllTabs();方法remove掉所有的tab,坑
    

    然后标题就不见了,设置的指示器的宽度也失效了,移除了所有的tab,那我将item写在布局里面有卵用,当然你可以自己去实现TabLayout和Viewpager的关联,这样不调用setupWithViewiPager就不会失效了。
    那这里我们还要用,那就在调用方法之后再来设置这些样式和内容就好了,xml布局文件里面不写了。

    tabLayout.addTab(tabLayout.newTab().setText("aaaa"),true);
    tabLayout.addTab(tabLayout.newTab().setText("bbb"));
    LinearLayout linearLayout = (LinearLayout) tabLayout.getChildAt(0);
    linearLayout.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);
    linearLayout.setDividerDrawable(ContextCompat.getDrawable(this, R.drawable.tab_divider));
    linearLayout.setDividerPadding(30);
    TabLayoutUtil.setIndicator(this,tabLayout,80,80);
    

    这样直接绑定ViewPager之后再开始设置tab,这样总行了吧,实际上是不行的,因为你在这之前绑定了ViewPager,ViewPager里面的两个fragment会默认生成两个空白的tab,然后再加上此时你设置的两个tab变成了四个,所以在这之前你还得先添加两个tab,然后在setupWithViewPager绑定之后修改这两个的文字和样式即可,所以最终的就是这个样子:

    private void setAdapter() {
            tabLayout.addTab(tabLayout.newTab());
            tabLayout.addTab(tabLayout.newTab());
            List<Fragment> fragmentList = new ArrayList<>();
            fragmentList.add(LoginWithPwdFragment.newInstance());
            fragmentList.add(LoginWithCodeFragment.newInstance());
            ABaseFragmentAdapter adapter = new ABaseFragmentAdapter(getSupportFragmentManager(),fragmentList);
            vp.setAdapter(adapter);
            tabLayout.setupWithViewPager(vp);//会调用removeAllTabs();方法remove掉所有的标题,坑
            setTabStyle();
        }
    
        private void setTabStyle() {
            tabLayout.getTabAt(0).setText("账号密码登录");
            tabLayout.getTabAt(1).setText("手机号快捷登录");
            tabLayout.addTab(tabLayout.newTab().setText("aaaa"),true);
            tabLayout.addTab(tabLayout.newTab().setText("bbb"));
            LinearLayout linearLayout = (LinearLayout) tabLayout.getChildAt(0);
            linearLayout.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);
            linearLayout.setDividerDrawable(ContextCompat.getDrawable(this, R.drawable.tab_divider));
            linearLayout.setDividerPadding(30);
            TabLayoutUtil.setIndicator(this,tabLayout,80,80);
        }
    

    最终结果就是全文中的唯一一张效果图。

    后续:

    在平板上发现tabLayout并不能match_parent然后平分屏幕宽度,而是居中了wrap_content,在网上看到了解决方案,TabLayout控件下必须写明三个属性:

    app:tabMaxWidth="0dp"
    app:tabMode="fixed"
    app:tabGravity="fill"

    这样就可以解决平板上的这个问题。

    参考:
    1、系列文章:
    TabLayout高端用法(一)
    TabLayout高端用法(二)
    TabLayout高端用法(三)

    2、根据需求添加分割线:https://blog.csdn.net/qq_26413249/article/details/54093288
    3、修改tablayout每个tab指示器的宽度:https://blog.csdn.net/u013134391/article/details/70833903
    https://www.jianshu.com/p/83922d08250b
    https://www.jianshu.com/p/031b44469476(参考本条目第一个地址的一篇)
    注意:

    image.png

    相关文章

      网友评论

          本文标题:TabLayout的使用

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