Android TabLayout的使用与总结

简介: 最近的新项目里老是会用到tablayout,便想着自己也总结下,加深印象,于是他来啦!

最近的新项目里老是会用到tablayout,便想着自己也总结下,加深印象,于是他来啦!


一、什么是TabLayout?


TabLayout是Android中的一个控件,常和ViewPager搭配使用,运用于tab切换viewpager,Google在升级了AndroidX之后,将TabLayout迁移到material包的com.google.android.material.tabs.TabLayout


二、常规使用

即TabLayout和viewpager(viewpager2也行)的搭配使用


1.xml文件



这是一个IM模块的界面,需要展示好友列表和聊天列表,使用的约束布局,tablayout用于切换viewpager和标题展示,最下面的一个图片是需求上的点击跳转搜索好友界面


<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"//用layout作为父布局是因为databinding的原因
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingTop="48dp"
        android:background="@color/black"
        >
        <com.google.android.material.tabs.TabLayout
            android:id="@+id/im_contact_tab"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            app:tabBackground="@color/black"
            app:tabIndicatorGravity="bottom"//在tab的底部
            app:tabIndicatorFullWidth="false"
            app:tabIndicator="@drawable/tab_indicator"//为了需求自定义的tabindicator
            app:tabIndicatorColor="#FFF65F2A"//颜色
            android:layout_marginEnd="60dp"
            app:tabSelectedTextColor="@color/white"//选中后文本颜色
            app:layout_constraintEnd_toStartOf="@id/im_add_img"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:tabTextColor="#ccffffff" />
        <androidx.viewpager2.widget.ViewPager2
            android:id="@+id/im_contact_viewpager"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:layout_constraintTop_toBottomOf="@id/im_contact_tab"
            app:layout_constraintBottom_toBottomOf="parent">
        </androidx.viewpager2.widget.ViewPager2>
        <androidx.appcompat.widget.AppCompatImageView
            android:layout_width="24dp"
            android:layout_height="24dp"
            android:layout_marginEnd="16dp"
            android:id="@+id/im_add_img"
            android:src="@mipmap/ic_add_friend_new"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@id/im_contact_tab"
            app:layout_constraintTop_toTopOf="@id/im_contact_tab"
            app:layout_constraintBottom_toBottomOf="@id/im_contact_tab"
            />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

2.实现代码(kotlin)



class IMContactFragment : BaseBindFragment<FgContactLayoutBinding>() {
    //使用的databinding
    override val layout: Int
        get() = R.layout.fg_contact_layout
    private val viewPager: ViewPager2 by lazy { mBinding.imContactViewpager }
    private val tabLayout: TabLayout by lazy { mBinding.imContactTab }
    var fragments = mutableListOf<Fragment>()//fragment列表
    var titles = mutableListOf("Friends","Message")//标题列表
    companion object {
        fun getInstance(): IMContactFragment {
            return IMContactFragment()
        }
    }
    //重写initView方法(其实就是在父类的onCreate()方法里面,不用在意)
    override fun initView() {
        //添加fragment
        fragments.add(FriendListFragment())//好友列表
        fragments.add(MessageListFragment())//聊天列表
        //为viewpager2设置adapter,重写getItemCount方法和createFragment方法,就把fragment添加到viewpager里面了
        viewPager.adapter = object : FragmentStateAdapter(this) {
            override fun getItemCount() = fragments.size
            override fun createFragment(position: Int) = fragments[position]
        }
        //为tablayout的tabItem添加标题,并且将tablayout和viewpager2绑定
        TabLayoutMediator(tabLayout, viewPager) { tab, position ->
            tab.text = titles[position]
        }.attach()
    }
    //重写initListener方法(其实就是在父类的onCreate()方法里面,不用在意)
    override fun initListener() {
      //为tablayout添加select监听器,这儿主要是实现选中时的标题字体大小、颜色、粗细等发生改变
        tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
            override fun onTabSelected(tab: TabLayout.Tab) {
                val customView = tab.customView
                if (customView == null) {
                    tab.setCustomView(R.layout.tab_text_layout)
                }
                val textView: TextView? = tab.customView?.findViewById(android.R.id.text1)
                textView?.setTextAppearance(requireContext(), R.style.TabLayoutTextSelected)
            }
            override fun onTabUnselected(tab: TabLayout.Tab) {
                val customView = tab.customView
                if (customView == null) {
                    tab.setCustomView(R.layout.tab_text_layout)
                }
                val textView: TextView? = tab.customView?.findViewById(android.R.id.text1)
                textView?.setTextAppearance(requireContext(), R.style.TabLayoutTextUnSelected)
            }
            override fun onTabReselected(tab: TabLayout.Tab) {}
        })
    }
}
3.tab选中和未选中时的文本
 <style name="TabLayoutTextSelected">
        <item name="android:textSize">24sp</item>
        <item name="android:textStyle">bold</item>
        <item name="android:textColor">@color/white</item>
    </style>
    <style name="TabLayoutTextUnSelected">
        <item name="android:textSize">14sp</item>
        <item name="android:textStyle">normal</item>
        <item name="android:textColor">@color/white_ccffffff</item>
    </style>

4、实现效果





三、常用属性介绍


tabIndicatorFullWidth=false/true tab的indicator是否和文本一样宽

tabIndicatorGravity  tab的indicator在tabitem的展示位置,顶部,居中,底部等等

tabTextAppearance 文本的展示样式,有时候需求需要切换item后不止颜色改变,还需要改变大小,粗细等等,就可以自定义一个style文件,例如上面的例子是在代码里根据监听动态设置的,下面是在xml设置:

//这是自定义的style文件
<style name="TabLayoutTheme">
        <item name="android:textSize">16sp</item>
        <item name="android:textStyle">bold</item>
</style>
//这是xml布局文件,设置app:tabTextAppearance属性
<com.google.android.material.tabs.TabLayout
        ...
        app:tabTextAppearance="@style/TabLayoutTheme"
        >
        4.tabSelectedTextColor 和 tabTextColor 字面意思
        5.app:tabIndicator="@drawable/tab_indicator" 设置自定义indicator
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <item android:gravity="center">
        <shape>
            <size
                android:width="24dp"
                android:height="4dp" />
            <solid android:color="#FFF65F2A" />
        </shape>
    </item>
</layer-list>

       6.app:tabIndicatorColor="#FFF65F2A" //indicator的颜色


       7.tabMode:tabMode属性用于设置tab是否可以横向滚动,可选的值有fixed(默认)、auto、scrollable。


       8.tabIndicatorHeight:这个属性设置指示器的高度,如果我们不需要显示指示器,则可以设置tabIndicatorHeight 为0


     


相关文章
|
2月前
|
Android开发
android 快速更改TabLayout的选中背景颜色。
android 快速更改TabLayout的选中背景颜色。
11 0
|
2月前
|
Android开发
Android 开发 tablayout 字体加粗 ,简便的手法:
Android 开发 tablayout 字体加粗 ,简便的手法:
11 0
|
5月前
|
XML Java Android开发
Android Studio App开发中工具栏Toolbar、溢出菜单OverflowMenu、标签布局TabLayout的讲解及实战(实现京东App的标签导航栏,附源码)
Android Studio App开发中工具栏Toolbar、溢出菜单OverflowMenu、标签布局TabLayout的讲解及实战(实现京东App的标签导航栏,附源码)
68 0
|
9月前
|
缓存 Android开发
Android TabLayout的使用详解
Android TabLayout的使用详解
76 0
|
12月前
|
XML Android开发 数据格式
Android 底部导航栏(三、ViewPager+TabLayout+Fragment)简单易懂
底部导航栏在Android应用中随处可见,今天使用ViewPager+TabLayout+Fragment这三个控件来实现此功能。 前面使用了另外两个方法来实现导航栏,不过我还是更喜欢Viewpager,代码也少,毕竟前两个不能左右滑动。
|
XML Java API
Android原生TabLayout使用全解析,看这篇就够了
Android原生TabLayout使用全解析,看这篇就够了
1519 0
Android原生TabLayout使用全解析,看这篇就够了
|
存储 Android开发
android ViewPager + Fragment + Tablayout 实现嵌套页面导航(二)
android ViewPager + Fragment + Tablayout 实现嵌套页面导航
android ViewPager + Fragment + Tablayout 实现嵌套页面导航(二)
|
编译器 Android开发 容器
android ViewPager + Fragment + Tablayout 实现嵌套页面导航(一)
android ViewPager + Fragment + Tablayout 实现嵌套页面导航
android ViewPager + Fragment + Tablayout 实现嵌套页面导航(一)
|
Android开发
Android Support Design Library之TabLayout
Android Support Design Library之TabLayout
123 0
Android Support Design Library之TabLayout
|
XML Android开发 数据格式
【安卓开发】TabLayout的使用
【安卓开发】TabLayout的使用
103 0