ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

优雅的拦截TabLayout的点击事件

2021-11-29 17:33:33  阅读:509  来源: 互联网

标签:disableClickPositionListener ProviderManager 优雅 点击 tab import disableClickPositi


背景:特定需求,点击某一个tab时,拦截这个事件,做一些其他操作。如下图
在这里插入图片描述
搜了下网上的实现方式,都不是很理想,于是自己深究源码,发现TabLayout中每次点击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 = 1
            // tab拦截事件
            mTabLayout.disableClickPositionListener = {
                ProviderManager.getUserProvider().jumpToLogin(INTENT_FLAGS_NONE)
            }
        }
    }

标签:disableClickPositionListener,ProviderManager,优雅,点击,tab,import,disableClickPositi
来源: https://blog.csdn.net/xiaocheng0404/article/details/121614950

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有