当前位置:网站首页>优雅的拦截TabLayout的点击事件
优雅的拦截TabLayout的点击事件
2022-08-03 05:22:00 【city_happiness】
背景:特定需求,点击某一个tab时,拦截这个事件,做一些其他操作。如下图
搜了下网上的实现方式,都不是很理想,于是自己深究源码,发现TabLayout中每次更新Tab状态时(包括点击Tab)都会调用selectTab方法,因此我们只需要重写该方法就可以达到目的。
实现代码如下(kotlin实现):
import android.content.Context
import android.util.AttributeSet
import androidx.annotation.NonNull
import androidx.annotation.Nullable
import com.google.android.material.tabs.TabLayout
class MFTabLayout @JvmOverloads constructor(@NonNull context: Context, @Nullable attrs: AttributeSet? = null, defStyleAttr: Int = 0) :
TabLayout(context, attrs, defStyleAttr) {
var disableClickPosition: Int = -1 // default -1, 不禁用,如1,表示禁止点击position为1的tab
var disableClickPositionListener: (tab: Tab?) -> Unit = {} // 当想监听某个被禁止点击position的tab点击事件时
fun resetDisableClickPosition() {
disableClickPosition = -1
}
override fun selectTab(tab: Tab?) {
// 如果点击的tab索引与期望的索引一致,进行拦截,并调用listener(disableClickPositionListener),然后返回
if ((tab?.position ?: 0) == disableClickPosition) {
disableClickPositionListener(tab)
return
}
super.selectTab(tab)
}
}
使用
// 根据用户已登录/未登录
private fun checkVisitorMode() {
if (ProviderManager.getUserProvider().isLogin()) {
val userId = ProviderManager.getUserProvider().getLoginName()
ProviderManager.getThirdProvider().setUserId(userId)
// 用户已登录,重置索引,不拦截
mTabLayout.resetDisableClickPosition()
} else {
// 用户未登录,因为tab 我的位置索引是1,因此这里传值1来拦截“我的”
mTabLayout.disableClickPosition = TAB_POSITION_ME // TAB_POSITION_ME为常量,值为1
// tab拦截事件监听
mTabLayout.disableClickPositionListener = {
ProviderManager.getUserProvider().jumpToLogin(INTENT_FLAGS_NONE)
}
}
}
边栏推荐
猜你喜欢

NFT租赁提案EIP-5006步入最后审核!让海外大型游戏的链改成为可能

亲身分享一次 字节跳动 真实面试经历和面试题

Flask,3-6

【Arduino】关于“&”和“|” 运算-----多个参数运算结果异常的问题解决

Leetcode刷题——一些用层次遍历解决的问题(111. 二叉树的最小深度、104. 二叉树的最大深度、226. 翻转二叉树、剑指 Offer 27. 二叉树的镜像)

Qlik Sense 聚合函数及范围详解(Sum、Count、All、ToTaL、{1})

【IDEA】字体修改-护眼主题-文件注释头设置

uni-app 滚动到顶部/指定位置

用iPhone前摄3D人像建模,Meta:我看行

BeanFactory和FactoryBean的区别
随机推荐
【 command execution and middleware loopholes 】
中国食品产业园区行业前景规划建议及投融资模式分析报告2022~2028年
【DC-2 Range Penetration】
Try setting CHROME_EXECUTABLE to a Chrome executable
Oracle count(1)、count(*)、count(列) 区别详解
7.16(6)
7.17(7)
编程软件配备
【Yarn】yarn常用命令 查看日志和Kill任务
Oracle 注释详解(--、/**/、rem)
Invalid signature file digest for Manifest main attributes解决方法
The ` monorepo ` ` hoist ` mechanism lead to the change of the loading configuration file path
【IDEA】字体修改-护眼主题-文件注释头设置
动态调整web系统主题? 看这一篇就够了
中国聚氯乙烯(PVC)土工膜发展动态及投资前景预测报告2022~2028年
经典论文-ResNet
当我们在看Etherscan的时候,到底在看什么?
浏览器多线程离屏渲染压缩打包方案
MySQL 排序
Oracle null 有哪些注意事项【面试题】