android原生TabLayout之自定义指示器效果

com.google.android.material.tabs.TabLayout” 这个玩意说起来大家都不陌生。结合viewPager或者单独使用。场景非常多。当然市面上的三方也数不胜数。但是毕竟是亲儿子。用起来终归是顺手一些。下面说一下TabLayout的具体用法细节:

首先,xml布局引入(此处为举例说明,具体属性用法自行百度):

<com.google.android.material.tabs.TabLayout
        android:id="@+id/tab_record_layout"
        android:layout_width="match_parent"
        android:layout_height="43dp"
        android:background="@color/transparent"
       
       	#具体属性用法自行百度
        app:tabIndicatorColor="#0E55FD"
         />

下面先说一下具体调用:

 for (i in list.indices) {
		tab_layout.addTab(tab_layout.newTab()) //动态创建tab
		//亦或
		tab_layout.newTab().setText(data.type_name).setTag(data.type_id) 
 }

然后就是动态添加TabLayout的样式,如果是属性可以满足就不需要,如果自带属性不能满足效果,则自定义样式,如下:

 for (i in 0 until tab_layout.tabCount) {
            val tab = tab_layout.getTabAt(i)
            tab?.customView = layoutInflater.inflate(R.layout.custom_tab, null)

            if (tab != null && tab.customView != null) {
                val abIcon = tab.customView!!.findViewById<ImageView>(R.id.iv_tab_item)
                val tabTitle = tab.customView!!.findViewById<TextView>(R.id.tv_tab_item)
                tabTitle.text = tab.text

                //把第一个设为默认选中
                if (i == 0) {
                    tabTitle.setTextColor(Color.parseColor("#0E55FD"))
                    tabTitle?.typeface = Typeface.defaultFromStyle(Typeface.BOLD)
                    abIcon.isInvisible = false
                }
            }
        }
        

最后就是添加监听:

tab_layout.addOnTabSelectedListener(onTabSelectedListener)
//...
val onTabSelectedListener: TabLayout.OnTabSelectedListener =
        object : TabLayout.OnTabSelectedListener {
        	//选中监听
            override fun onTabSelected(tab: TabLayout.Tab) {
                if (tab.customView != null) {
                //获取自定义tab布局中的view
                    val tabIcon = tab.customView!!.findViewById<ImageView>(R.id.iv_tab_item)
                    val tabTitle = tab.customView!!.findViewById<TextView>(R.id.tv_tab_item)
                    tabTitle.text = tab.text
                    tabTitle.setTextColor(Color.parseColor("#0E55FD"))
                    tabTitle?.typeface = Typeface.defaultFromStyle(Typeface.BOLD)
                    tabIcon.isInvisible = false
                }
                type_id = mViewModel.typeList.get(tab.position).type_id
                mViewModel.getList(type_id)
            }

			// 未选中监听
            override fun onTabUnselected(tab: TabLayout.Tab) {
                if (tab.customView != null) {
                    val tabIcon = tab.customView!!.findViewById<ImageView>(R.id.iv_tab_item)
                    val tabTitle = tab.customView!!.findViewById<TextView>(R.id.tv_tab_item)
                    tabTitle.text = tab.text
                    tabTitle.setTextColor(Color.parseColor("#333333"))
                    tabTitle.typeface = Typeface.defaultFromStyle(Typeface.NORMAL);
                    tabIcon.isInvisible = true
                }
            }

            override fun onTabReselected(tab: TabLayout.Tab) {}
        }

最后,如果是ViewPager + TabLayout需要联动的话,则添加联动代码:

 //使用.attach()将TabLayout和ViewPager2进行绑定,如果没有这步操作将不会联动
        TabLayoutMediator(tab_layout, viewPager) { tab, position ->
            //根据position修改tab的样式和文字等
            tab.text = tabTitles[position]
        }.attach()

具体需结合场景,灵活使用。
END

相关推荐

  1. android原生TabLayout定义指示器效果

    2024-06-08 12:06:03       11 阅读
  2. Android 定义权限

    2024-06-08 12:06:03       33 阅读
  3. Android 定义BaseFragment

    2024-06-08 12:06:03       30 阅读
  4. Android 定义BaseActivity

    2024-06-08 12:06:03       33 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-08 12:06:03       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-08 12:06:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-08 12:06:03       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-08 12:06:03       20 阅读

热门阅读

  1. Redis持久化机制:RDB与AOF的原理和最佳实践

    2024-06-08 12:06:03       10 阅读
  2. 2023 N1CTF Junior pwn 顶级签到

    2024-06-08 12:06:03       11 阅读
  3. C++ 实现Python 列表list 的两种方法

    2024-06-08 12:06:03       8 阅读
  4. flutter 解析json另类封装方式 List<bean>,哈哈哈

    2024-06-08 12:06:03       8 阅读
  5. Linux学习之查看文件内容

    2024-06-08 12:06:03       12 阅读
  6. linux-磁盘空间显示指令

    2024-06-08 12:06:03       9 阅读
  7. 基于截图和模拟点击的自动化压测工具开发(MFC)

    2024-06-08 12:06:03       8 阅读
  8. Git - 创建和应用patch

    2024-06-08 12:06:03       10 阅读
  9. 自动化喷涂生产线方案三

    2024-06-08 12:06:03       10 阅读
  10. 【每日一函数】uname 函数介绍及代码演示

    2024-06-08 12:06:03       8 阅读