Android TabLayout首次未选中状态分析

RecyclerView与TabLayout的滚动定位 (转载请注明出处) 最近项目有个需求,RecyclerView+TabLayout联动,点击随意一个tab标签,指定RecyclerView定位到对应位置,滑动RecyclerView,让tab跳到相应的标签。先上图 这个是点击tab的 这个是滑动recyclerview的,嗯,大体就这样。 现在,我们先一条一条分析,首先,recyclerview的滚动到指定一个的位置,也就是我们... 阅读详情

最近在学习TabLayout的时候,发现个问题,刚进入的时候,第一个tab并没有变成我们想要的选中状态。
设置选中的状态如下:

tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                View customView = tab.getCustomView();
                TextView tabItem = customView.findViewById(R.id.tv_tab_item);
                tabItem.setBackgroundColor(Color.parseColor("#ff5500"));
                pager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                View customView = tab.getCustomView();
                TextView tabItem = customView.findViewById(R.id.tv_tab_item);
                tabItem.setBackgroundColor(Color.parseColor("#ffffff"));
            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {               
            }
        });
        tabLayout.getTabAt(0).select();

在这里插入图片描述
就是这种情形,只是将textview的背景色设为橙色,但是如果上面代码设置的话,刚进入的时候是都没有选中的。虽然设置了tabLayout.getTabAt(0).select();,但是会发现是没有效果的,后面跟进源码发现

public void select() {
            if (this.parent == null) {
                throw new IllegalArgumentException("Tab not attached to a TabLayout");
            } else {
                this.parent.selectTab(this);
            }
        }

进入到父布局的设置选中

    void selectTab(TabLayout.Tab tab) {
        this.selectTab(tab, true);
    }

    void selectTab(TabLayout.Tab tab, boolean updateIndicator) {
        TabLayout.Tab currentTab = this.selectedTab;
        if (currentTab == tab) {
            if (currentTab != null) {
                this.dispatchTabReselected(tab);
                this.animateToTab(tab.getPosition());
            }
        } else {
            int newPosition = tab != null ? tab.getPosition() : -1;
            if (updateIndicator) {
                if ((currentTab == null || currentTab.getPosition() == -1) && newPosition != -1) {
                    this.setScrollPosition(newPosition, 0.0F, true);
                } else {
                    this.animateToTab(newPosition);
                }

                if (newPosition != -1) {
                    this.setSelectedTabView(newPosition);
                }
            }

            this.selectedTab = tab;
            if (currentTab != null) {
                this.dispatchTabUnselected(currentTab);
            }

            if (tab != null) {
                this.dispatchTabSelected(tab);
            }
        }

    }

会发现如果当前选中的布局和设置选中的布局是同一个的时候,就会调用dispatchTabReselected(tab);

private void dispatchTabReselected(@NonNull TabLayout.Tab tab) {
        for(int i = this.selectedListeners.size() - 1; i >= 0; --i) {
            ((TabLayout.BaseOnTabSelectedListener)this.selectedListeners.get(i)).onTabReselected(tab);
        }

    }

就会回调new TabLayout.OnTabSelectedListener() 中的onTabReselected方法,但是我们没有在这个方法内部进行选中设置,所以才会导致刚进入时候三个选项卡都没有选中,这里只要把onTabReselected中设置选中状态即可
完整的代码如下:

tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                View customView = tab.getCustomView();
                TextView tabItem = customView.findViewById(R.id.tv_tab_item);
                tabItem.setBackgroundColor(Color.parseColor("#ff5500"));
                pager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                View customView = tab.getCustomView();
                TextView tabItem = customView.findViewById(R.id.tv_tab_item);
                tabItem.setBackgroundColor(Color.parseColor("#ffffff"));
            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {
                View customView = tab.getCustomView();
                TextView tabItem = customView.findViewById(R.id.tv_tab_item);
                tabItem.setBackgroundColor(Color.parseColor("#ff5500"));
                pager.setCurrentItem(tab.getPosition());
            }
        });
        tabLayout.getTabAt(0).select();

这样就没有问题了。

Android TabLayout实战:仿微信底部Tab导航设计与实现 在Android UI发展进程中,Google提出的Material Design不仅是一套视觉规范,更是一种以用户为中心的交互语言。作为其关键组件之一,TabLayout承载着页面导航的核心职责,体现了“层级清晰、操作直观、反馈明确”的设计理念。它通过统一的标签样式、平滑的滑动指示器和可预测的状态反馈,提升应用的可用性与一致性。例如,在微信等主流App中,底部Tab采用图文混排、颜色状态切换等方式,精准引导用户行为,正是TabLayout结合Material Design原则的实际体现。 阅读详情

相关推荐

Android中Fragment与TabLayout实现选项卡功能详解

Fragment本质上是一个类,继承自(在旧版本中)或(使用AndroidX库时)。它与Activity非常相似,具备独立的生命周期方法、布局资源加载、事件监听等能力。一个典型的Fragment类结构如下:@Override// 初始化非UI相关的逻辑@Override// 加载布局文件@Override// 初始化视图和绑定事件@Override// 与Activity关联后的逻辑@Override// 释放视图相关资源@Override。

weixin_35756892的博客 1032

Tablayout初始全部不选中,初始默认选中一个,初始全部选中的设置

在一个项目中要实现TabLayout的初始全部Tab都不选中状态 去看TabLayout的API愣是没找到设置全部不选中的属性和方法 最后发现 tabLayout.addTab(Tablayout.Tab tab,boolean setSelected)方法 可以通过第二个参数设置Tab初始不选中状态 于是我们就可以在添加Tab的时候就设置不选中状态来达到初始Tab不被选中状态  ...

yh18668197127的博客 1万+

开源机器学习平台tipdm

TipDM建模平台 tipdm开源的python机器学习建模平台,用户通过拖拉就可以实现模型开发。 项目结构 backend :为java后台服务代码 frontedn :为vue js前端代码 mock-oauth-server:为java认证服务代码 主要分析backend后台服务代码,典型的java spring mvc web项目,项目结构如下: framework-common:公共代码,主要为工具类,spring相关公用类 framework-model: 实体..

wflh323的专栏 4247

android tab默认选中事件,android – 启动时未选中TabLayout选中的Tab图...

我在我的应用程序中使用TabLayout进行选项卡式导航.我有一个非常奇怪的问题,我使用此代码创建了4个选项卡:private int[] tabIcons = {R.drawable.navigation_timeline_icon_selector, R.drawable.navigation_feed_icon_selector,R.drawable.navigation_messages_...

weixin_28487725的博客 529

(nginx) nginx5 nginx https部署实战

综上所述,相比 HTTP 协议,HTTPS 协议增加了很多握手、加密解密等流程,虽然过程很复杂,但其可以保证数据传输的安全。所以在这个互联网膨胀的时代,其中隐藏着各种看不见的危机,为了保证数据的安全,维护网络稳定,建议大家多多推广HTTPS。SSL 证书费用很高,以及其在服务器上的部署、更新维护非常繁琐HTTPS 降低用户访问速度(多次握手)网站改用HTTPS 以后,由HTTP 跳转到 HTTPS 的方式增加了用户访问耗时(多数网站采用302跳转)

weixin_50382197的博客 1504

创建可视化机房

(3)窗户位置创建好以后需要对窗户的墙面镂空位置进行修补,具体操作为,选中镂空位置的顶点(这里必须是选择一个平面的顶点,不要跨平面选择),实际操作如下图:选择点以后,鼠标右键,选择【从顶点创建边/面】,或者按F键,随后对其他镂空位置进行相同操作;(2)将【物体模式】修改为【编辑模式】,选中-x对应面的所有顶点,移动顶点位置,其他放小调整按照同理,找到选中对应面的所有顶点,移动位置即可;调整动画事件轴上的线,选中关键帧的时间,调整模型的位置或者旋转角度,具体根据插入关键帧菜单选择的项进行模型的相关调整。

SmileBu丿㦌的博客 2062

Android 项目开发知识课外拓展之Tablayout

1.tablayout的tab选中的监听addOnTabSelectedListener项目中的界面需要用viewpager+tablayout+fragment来实现 实现起来相对来说很简单,但是现在有的需求是在第一个fragment的外面显示一个按钮,在其他的页面不显示这个时候就用到了这个监听方法,先看一下图片听方法,先看一下图片 图中可以看到只有学生界面才有筛选按钮 但是后面都没有 一切bb都是没有用的 上代码 2.修改tablayout的下划线指定宽度 加上去就搞定 当然了 具体可以参

72的博客 1101

使用pdfBox实现pdf转图片出现中文方块乱码 简单修改源码解决

参考文章 问题排查:使用pdfbox将pdf转image时STSong-Light字体中文乱码 pdfbox版本是2.0 日志中打印出类似这样的日志(例:Using fallback XXX for CID-keyed font STSong-Light),就说明系统没有安装STSong-Light字体,pdfbox使用XXX字体来替代了。如果出现方块,就说明没有这种字体,并且替代字体也没有,日志也有相应的其他提示。 正常操作就是安装缺失的 STSong-Light 字体,但是在网上搜到的都是 STSong

aji_csdn的博客 5266

【踩坑】TabLayout 默认选中无效

写一个demo时发现,其中TabLayout作为底部导航栏,默认选中竟然无法回调onTabSelected,而选择其他Position时,可以正常回调回来 原因是因为我们是先addTab这个时候还没有绑定回调方法,所以应该是先是设置回调,而后add mTabLayout = findViewById(R.id.tab_layout); mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListen

xyzBlog 1693

《UE4游戏开发》之 《音效系统的实现》

音效系统需要负责管理什么事情: 1.1 确定声音控制的分类:如背景音乐、技能音效、界面音效、角色配音等,不同游戏对声音有不同的分类 1.2 控制每个分类的声音的开启与关闭,以及调节每个分类声音的大小 解决如何分类: 2.1 首先需要知道ue4为声音分类提供了什么:SoundClass通常需要一个根分类【SC_RPG_Master】,便于总体控制音效,以及指定引擎默认启动的音效 打开SoundClass资产【SC_RPG_Master】,对根控制的设置,将逐级传递并按比例进行设置,以此达到控制一类声音的目的.

qq_21919621的博客 2126

【SMPL简介】SMPL: A Skinned Multi-Person Linear Model【源码复现】

SMPL是一种3D人体建模方法.在数字人或者人物角色三维重建领域有着广泛应用支持人体的各种形状及动作可以简单理解为通过训练获取的人物模型SMPL 输入是:姿态shape vectorβ\betaβ+ 影响动作Pose的参数θ\thetaθ输出是: 各种变化后vertex顶点的数据作者:Loper, Matthew and Mahmood, Naureen and Romero, Javier and Pons-Moll, Gerard and Black, Michael J.

zik的博客 3368

Android TabLayout中tab无法点击问题

最近在使用TabLayout+ViewPager+fragment时,发现个问题,TabLayout中Tab始终无法点击,最后网上查找半天才发现是布局问题,原来布局是 <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app=

明天的增加的博客 1868

【LAMMPS学习】八、基础知识(4.5)TIP5P水模型

​ 五点 TIP5P 刚性水模型通过添加两个通常无质量的附加位点 L 来扩展three-point TIP3P model,其中放置与氧原子相关的电荷。这些位点 L 位于距氧原子固定距离处,形成从 HOH 平面旋转 90 度的四面角。因此,这些位点在某种程度上近似于氧的孤对,从而改善了水结构,与four-point TIP4P model相比变得更加“四面体”。

荷塘阅色 1420

Android字体大小选择控件,Android 修改TabLayout选中状态字体大小

前言TabLayout对于我们来说并不陌生,大部分项目都会使TabLayout+Viewpager+Fragment展示首页列表内容,一般情况下,只会设置选中时tab颜色改变,并不会设置字体大小的改变,这些从TabLayout的属性亦可知。通常情况下,如果需要改变选中tab的字体大小,一般都是去引用第三方库去实现这种效果,但是又觉得这种做法得不偿失。通过阅读TabLayout源码可知,可以设置自定...

weixin_34923852的博客 1260

API深度集成——OpenClaw与第三方服务无缝对接(2026实战版)

本文介绍了OpenClaw系统与第三方服务的API深度集成技术,重点阐述了RESTful API的实现方案。通过一个功能完善的REST客户端类(RestClient)展示了核心功能:支持请求重试、拦截器机制、错误处理和认证管理等;同时提供了API资源管理器(ApiResourceManager)简化资源操作。这些技术实现了OpenClaw与外部系统的稳定可靠对接,为开发者构建API集成方案提供了2026年的最佳实践。

博客 1213

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

[Android开发] TabLayout 选中改变字体大小颜色、指示线

Android TabLayout 选中改变字体大小颜色、指示线 1 思路分析 在本次项目中,交互设计要求实现 TabLayout 的点击效果,包括字体大小、颜色、指示线的样式等效果。 2 实现思路 2.1改变 tab 字体大小、颜色 我希望在代码中实现这个效果。首先在 ```colors.xml`` 添加点击前后的颜色值: <color name="home_tab_selected...

龙王院的博客 7459

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

TabLayout初始化后onTabSelected首次没有被回调的问题

我们经常使用TabLayout控件来管理多个页面的展示,但是应用不当的话,可能会给我们带来一些小小的困扰。比如说,我就曾经遇到过TabLayout 初始化后OnTabSelectedListener中 onTabSelected首次没有被回调的问题。为了深刻了解问题的缘由,还需要从代码中一窥究竟。这篇文章主要是记录当时的学习的过程。 首先列出能够避免上述问题的使用代码: tabLayout...

yuminfeng728的博客 3887

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android TabLayout控件

在配置文件中指定TabItem

假装你是大灰狼的专栏 5986

android tab布局框架,Android TabLayout使用详解

通常在ViewPager的上方,我们都会放一个标签指示器与ViewPager进行联动。以前,我们大多使用的是GitHub上的开源框架PagerSlidingTabTrip。而现在,我们可以使用Android自带的控件TabLayout来实现这个效果了,而且TabLayout更为强大,因为Tab标签可以使用自定义View。本文通过TabLayout+ViewPager来展示新浪微博中的三种状态微博,...

weixin_29235525的博客 1130

TabLayout 选中改变字体大小颜色、指示线

Android TabLayout 选中改变字体大小颜色、指示线 1 思路分析 在本次项目中,交互设计要求实现 TabLayout 的点击效果,包括字体大小、颜色、指示线的样式等效果。 2 实现思路 2.1改变 tab 字体大小、颜色 我希望在代码中实现这个效果。首先在 colors.xml添加点击前后的颜色值: <color name="home_tab_selected"&g...

Welcome 3540

Android开发笔记(一百四十七)标签布局TabLayout

标签布局TabLayout是MaterialDesign库中的一个新控件,常与工具栏Toolbar搭配使用。大家平时常用的App就有不少采用了TabLayout,比如京东App的商品页,从左到右依次是“商品”、“详情”、“评价”,具体界面如下图所示:京东的这个页面便是典型的Toolbar+TabLayout效果,实现的话不外乎Toolbar内部嵌套TabLayout,然后TabLayout再通过V

aqi00的博客 3656

tablayout重写点击事件

for (int i = 0; i mTabLayout.getTabCount(); i++) { TabLayout.Tab tab = mTabLayout.getTabAt(i); if (tab != null) { tab.setCustomView(getTabView(i)); //对应tab定制view if (tab.getCus

凯文欧巴的IT全攻略 6107

Android TabLayout + ViewPager2 导航实现与避坑指南

TabLayout 和 ViewPager2 是 Android 中实现标签式页面导航的基础组件,属于 Fragment 容器与 UI 指示器协同工作的典型范式。其核心原理是通过声明式绑定(setupWithViewPager)自动同步页面滑动与标签选中状态,避免手动监听导致的线程调度和生命周期错乱问题。技术价值在于轻量、稳定、低学习成本,且深度集成 AndroidX 生命周期管理,显著降低 Fragment 重建丢失、状态不同步等高频崩溃风险。广泛应用于新闻、电商、工具类 App 的顶部多标签页场景,尤其

440

Android沉浸式状态栏、颜色渐变、副标题动画和TabLayout悬浮条

嘛,几天没学习,我浑身难受。 今天把前段时间公司这边的几个需求放在一起总结了一下,有这样几个: 沉浸式状态栏(5.0以上),并要求上部bar随着RecyclerView滑动变色 RecyclerView悬浮条,与普通悬浮条不同的是悬浮条是一个可滑动的TabLayout 副标题随着RecyclerView滑动动画上移或者动画下移 把这几个东西放一起来重新梳理一下吧,先上效果图: 左边...

xiaomi987的专栏 1744

探索优雅的Android TabLayout扩展库:TabLayout-Ext

探索优雅的Android TabLayout扩展库:TabLayout-Ext 在开发Android应用时,我们经常需要创建带有标签页的界面以提供更好的用户体验。Google的TabLayout组件无疑是实现这一目标的标准选择。然而,有时我们希望能实现一些特殊的UI效果,比如定制的指示器或独特的文字样式。现在,就让我们一起来看看一个名为TabLayout-Ext的开源项目,它为原生的TabLayo...

gitblog_00051的博客 973

android view padding,记一次tablayout的tabView偷偷自带padding的问题

这次故事主人翁还是tablayout,在github看官方demo的时候https://github.com/googlesamples/android-media-controller,效果图有一个指示器效果,于是我点进去看了代码,手贱改了一点东西发现了一点问题1. 官方demo ViewPage指示器效果图实现原理也很简单 使用tablayout,核心代码片段如下代码中绑定tablayout和...

weixin_39634132的博客 375
上一篇: Android TabLayout中tab无法点击问题
下一篇: Android TabLayout和ViewPager关联原理分析
明天的增加
博客等级 码龄11年 22粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值