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 { 
           ... 
        }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM