默认的TabLayout是没有花里胡哨的功能的,比如说我们可能希望它有边框,或者有背景颜色,或者外边框。因此就需要更改一些属性,或者在代码中实现。比如下图这种带边框,字体改变。

实现思路:

tablayout外层嵌套RelativeLayout,和viewpager配合使用

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#FAFAFA"><RelativeLayoutandroid:id="@+id/rlyout"android:layout_width="228dp"android:layout_height="25dp"android:layout_centerHorizontal="true"android:layout_marginTop="20dp"android:background="@drawable/tab_background_ridus"android:padding="1dp"><com.google.android.material.tabs.TabLayoutandroid:id="@+id/tabLayout"android:layout_width="match_parent"android:layout_height="match_parent"app:tabGravity="fill"app:tabIndicatorColor="#FF000000"app:tabIndicatorHeight="0dp"app:tabMaxWidth="0dp"app:tabMode="fixed"app:tabSelectedTextColor="@color/white"app:tabTextAppearance="@style/tabLayoutTextStyle"app:tabTextColor="@color/black" /></RelativeLayout><androidx.viewpager.widget.ViewPagerandroid:id="@+id/viewPager"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/rlyout"android:layout_marginTop="20dp"android:background="@color/colorPrimary"app:layout_constraintBottom_toBottomOf="parent" /></RelativeLayout>
tab_background_ridus.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><!-- 填充 --><solid android:color="@color/white" /><!-- 圆角 --><corners android:radius="20dp" /><strokeandroid:width="1dp"android:color="@color/black" />
</shape>
tabLayoutTextStyle 这个是自定义tablayout的字体大小等
    <style name="tabLayoutTextStyle"><item name="android:textSize">13sp</item><item name="android:fontFamily">sans-serif-medium</item></style>

在代码中添加addOnTabSelectedListener进行监听,然后修改当前布局的圆角、颜色等值,默认选中的是0位置的tab

        binding.tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {override fun onTabReselected(tab: TabLayout.Tab) {}override fun onTabUnselected(tab: TabLayout.Tab) {setBackground(tab, false)}override fun onTabSelected(tab: TabLayout.Tab) {setBackground(tab, true)}})binding.tabLayout.getTabAt(0)?.let { setBackground(it, true) }

setBackground()中做的事情就是根据当前位置的不同,设置不同的布局

    private fun setBackground(tab: TabLayout.Tab, selected: Boolean) {var drawable: Drawable? = nullwhen (tab.position) {0 -> {if (selected) {drawable = getDrawable(R.drawable.tab_background_checked)} else {drawable = getDrawable(R.drawable.tab_unchecked_first)}}1 -> {if (selected) {drawable = getDrawable(R.drawable.tab_background_checked_second)} else {drawable = getDrawable(R.drawable.tab_unchecked_second)}}}ViewCompat.setBackground(tab.view, drawable)}

比如,当第一个tab被选中时,我们希望它的左上左下都有圆角

也就是drawable为tab_background_checked文件

<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><solid android:color="@color/black" /><cornersandroid:topLeftRadius="20dp"android:bottomLeftRadius="20dp"/></shape>

这样就可以实现定制的一些需求

ps:当时一开始想的是去重写tablayout,这样就可以自定义它的字体大小、边框等等,但是发现其实没有必要,tablayout已经通过接口、或者是xml帮我们实现好了。

一个参考资料 tablayout自定义总结

Android 自定义TabLayout相关推荐

  1. android自定义TabLayout

    由于android自带的tablayout不能实现某些效果,所以我们简单自定义一个,能够满足大部分的使用场景 要点1:继承HorizontalScrollView,linearlayout中addvi ...

  2. android tablayout 自定义,TabLayout的自定义

    TabLayout的自定义,主要是通过setCustomView方法来添加自定义布局实现. 自定义TabLayout的实现主要包含以下几个步骤 ●创建自定义布局(这里我加了一个动画控件,可以替换成其他 ...

  3. android tablayout 自定义,TabLayout用法详解及自定义样式

    TabLayout的默认样式: app:theme="@style/Widget.Design.TabLayout" 从系统定义的该样式继续深入: fill fixed 264dp ...

  4. Android 自定义viewpage + videoview 实现竖屏视频播放效果

    Android 自定义viewpage + videoview 实现竖屏视频播放效果 效果图 实现步骤 前提概要 自定义 viewpage 自定义 videoview 主逻辑代码 效果图 由于用的是v ...

  5. Android 原生 TabLayout 使用全解析

    前言 为什么会有这篇文章呢,是因为之前关于TabLayout的使用陆陆续续也写了好几篇了,感觉比较分散,且不成体系,写这篇文章的目的就是希望能把各种效果的实现一次性讲齐,所以也有了标题的「看这篇就够了 ...

  6. android 圆角边框边框渐变,Android深度定制化TabLayout:圆角,渐变色,背景边框,圆角渐变下划线,基于Android原生TabLayout...

    Android深度定制化TabLayout:圆角,渐变色,背景边框,圆角渐变下划线,基于Android原生TabLayout 在附录1的基础上丰富自定义的TabLayout,这次增加两个内容: 1,当 ...

  7. Android原生TabLayout使用全解析,看这篇就够了

    前言 为什么会有这篇文章呢,是因为之前关于TabLayout的使用陆陆续续也写了好几篇了,感觉比较分散,且不成体系,写这篇文章的目的就是希望能把各种效果的实现一次性讲齐,所以也有了标题的「看这篇就够了 ...

  8. Android自定义ViewGroup基本步骤

    1.自定义属性,获取自定义属性,可参考 ​ Android自定义View基本步骤 ​ 2.onMeasure() 方法,for循环测量子View,根据子View的宽高来计算自己的宽 高 3.onDra ...

  9. Android自定义View —— TypedArray

    在上一篇中Android 自定义View Canvas -- Bitmap写到了TypedArray 这个属性 下面也简单的说一下TypedArray的使用 TypedArray 的作用: 用于从该结 ...

最新文章

  1. Unity应用架构设计(9)——构建统一的 Repository
  2. SAP QM初阶之事务代码CR05查询QM Work Center List
  3. RavenDB FS 安装使用 介绍
  4. V4L2 driver(一). 整体框架
  5. 关于拖拽上传 [一个拖拽上传修改头像的流程]
  6. python中easygui和tkinter_python easygui Tkinter
  7. Java NIO学习篇之通道FileChannel详解
  8. python 格式化输出
  9. 【Java】面向对象是什么
  10. CCCardinalSplineBy概念
  11. 暗渡陈仓:用低消耗设备进行破解和渗透测试2.3 本章小结
  12. 系统分析师成长之路 转
  13. 03 【Nginx虚拟主机和域名解析】
  14. 编辑中的word变成只读_word文件怎么将只读模式改为可以修改
  15. 浏览器与HTTP网络协议缓存原理分析 转自网界网:http://news.cnw.com.cn/news-china/htm2015/20151027_322909.shtml
  16. 高级硬件工程师是怎样炼成的
  17. C++ bitset的使用
  18. 2022大数据产业年度“国产化优秀代表厂商”榜单发布,亚信科技AntDB数据库位列其中
  19. Spring之完整版学习笔记
  20. 写一个在线位图字体制作工具!BitmapFont!

热门文章

  1. 【软件工程】软件工程知识点提纲8
  2. Mqtt通信协议详解
  3. mysql配置时区 serverTimeZone
  4. Matlab中创建一个矩阵的3种常用方法
  5. C语言学习——保留小数点后n位并四舍五入
  6. 算法笔记——常见DP问题汇总
  7. otg usb 定位_USB OTG插入检测识别
  8. 怎么将文字转图片?这三个办法很好用
  9. spring 的@PersistenceUnit和@PersistenceContext
  10. weblogic部署常见问题