zoukankan      html  css  js  c++  java
  • Kotlin如何防止点击事件重复(Android)

    前言

    相信大家在开发工作中,会经常遇见某个控件被重复点击,可能就会造成一些不可预知的问题。例如:跳转某个activity时,点击过快可能就会创建两个相同的界面~

    今天就和大家来分享下,利用 kotlin 的拓展函数和拓展属性解决这种问题

    第一步:在 res/values 目录下创建一个 ids.xml 的文件,定义两个属性:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <item name="triggerDelayKey" type="id"/>
        <item name="triggerLastTimeKey" type="id"/>
    </resources>
    

    第二步:在项目中,新建一个 .kt 文件,添加如下函数:

    /**
     * get set
     * 给view添加一个上次触发时间的属性(用来屏蔽连击操作)
     */
    private var <T : View>T.triggerLastTime: Long
        get() = if (getTag(R.id.triggerLastTimeKey) != null) getTag(R.id.triggerLastTimeKey) as Long else 0
        set(value) {
            setTag(R.id.triggerLastTimeKey, value)
        }
    
    /**
     * get set
     * 给view添加一个延迟的属性(用来屏蔽连击操作)
     */
    private var <T : View> T.triggerDelay: Long
        get() = if (getTag(R.id.triggerDelayKey) != null) getTag(R.id.triggerDelayKey) as Long else -1
        set(value) {
            setTag(R.id.triggerDelayKey, value)
        }
    
    /**
     * 判断时间是否满足再次点击的要求(控制点击)
     */
    private fun <T : View> T.clickEnable(): Boolean {
        var clickable = false
        val currentClickTime = System.currentTimeMillis()
        if (currentClickTime - triggerLastTime >= triggerDelay) {
            clickable = true
        }
        triggerLastTime = currentClickTime
        return clickable
    }
    
    /***
     * 带延迟过滤点击事件的 View 扩展
     * @param delay Long 延迟时间,默认500毫秒
     * @param block: (T) -> Unit 函数
     * @return Unit
     */
    fun <T : View> T.clickWithTrigger(delay: Long = 500, block: (T) -> Unit) {
        triggerDelay = delay
        setOnClickListener {
            if (clickEnable()) {
                block(this)
            }
        }
    }
    

    最后:代码中使用(目前只能在 kotlin 代码中调用)

            //指定某控件点击间隔时间:1000毫秒
            view.clickWithTrigger (1000){
                ...
            }
            //默认某控件点击间隔时间:500毫秒
            view.clickWithTrigger { 
               ... 
            }
    
  • 相关阅读:
    Redis的四种模式,单机、主从、哨兵、集群
    .NET 跨域问题
    C# 利用正则表达式获取富文本框中所有图片路劲
    ActiveMQ入门实例(.NET)
    ActiveMQ的使用以及应用场景
    关于消息队列的使用方法(RocketMQ)
    Redis系列 需要注意事项
    .NET:在线悲观锁、在线乐观锁、离线悲观锁、离线乐观锁代码示例
    C# 简单介绍Redis使用
    API Get跟Post 的区别?
  • 原文地址:https://www.cnblogs.com/io1024/p/11597797.html
Copyright © 2011-2022 走看看