防止或避免 Android 应用中的多次点击(Kotlin 语言)

Prevent or avoid Multiple clicks in Android app (Kotlin Language)

如何防止用户多次点击一个按钮??。

实际问题: 如果用户持续快速点击按钮。单击按钮多次执行我的 api 调用。

应用的解决方案无效:即使您尝试在 onClick() 之后直接禁用按钮,仍然有可能发生多次点击。

解决Android多次点击问题 — Kotlin

我搜索了社区并找到了很棒的解决方案,比如创建一个自定义点击监听器,它将保留最后一次点击时间并在特定时间段内阻止点击 但是——作为 Kotlin 的忠实粉丝——我想通过 lambda 和闭包的强大功能来非常顺畅地使用一些东西。 所以我想出了这个实现,希望能帮到你

第 1 步:使用名称 SafeClickListener.kt

创建 class
class SafeClickListener(

private var defaultInterval: Int = 1000,
private val onSafeCLick: (View) -> Unit
 ) : View.OnClickListener {
private var lastTimeClicked: Long = 0
override fun onClick(v: View) {
    if (SystemClock.elapsedRealtime() - lastTimeClicked < defaultInterval) {
        return
    }
    lastTimeClicked = SystemClock.elapsedRealtime()
    onSafeCLick(v)
     } 
 }

第 2 步:添加扩展功能以使其适用于任何视图,这将创建一个新的 SafeClickListener 并将工作委托给它。

    fun View.setSafeOnClickListener(onSafeClick: (View) -> Unit) {
    val safeClickListener = SafeClickListener {
        onSafeClick(it)
      }
    setOnClickListener(safeClickListener)
  }

第三步:现在使用起来非常简单。只需将 button1.setonclicklistner 替换为 setSafeOnClickListener.

settingsButton.setSafeOnClickListener {
    showSettingsScreen()
}

您可以使用以下代码完成任务:

var mLastClickTime = 0L
fun isClickRecently(): Boolean {
        if (SystemClock.elapsedRealtime() - mLastClickTime < 1000) {
            return true
        }
        mLastClickTime = SystemClock.elapsedRealtime()
        return false
}

并且您可以在单击按钮时调用此函数。

button.setOnClickListener {
    if (!isClickRecently()) {
         //your task to do
    }
}
//its work same as setOnClickListener  
//Create Function Like this in Utils File
                        
        fun View.setOnclick(listenerBlock: OnDebClickListener) =
                                        setOnClickListener(MulticlickPrevent(1000L, listenerBlock))
                                    
        class MulticlickPrevent(
              private val interval: Long, 
              private val listenerBlock: OnDebClickListener) : View.OnClickListener
         {
              private var LastClickListner = 0L
                                    
              override fun onClick(v: View) {
                      val time = System.currentTimeMillis()
                      if (time - LastClickListner >= interval) {
                         LastClickListner = time
                         listenerBlock.onClick(v)
                      }
                }
             }
                
    //On activity use like this
                   
    myview.setOnclick(object : OnDebClickListener{
             override fun onClick(var1: View?) {
                       TODO("Do your code")
             }
     })
            
    //Or
    class MainActivity : Activity() , OnDebClickListener{
          //in onCreate method
          myview.setOnclick(this)
    }