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 { 
           ... 
        }
posted @ 2019-09-27 14:26  ming3  阅读(2823)  评论(1编辑  收藏  举报