android-fragments 防止或避免在Android应用程序中多次点击(Kotlin语言)

nhn9ugyo  于 2022-11-14  发布在  Android
关注(0)|答案(3)|浏览(230)

如何防止用户多次单击按钮??.
**实际问题:**如果用户持续快速点击按钮。按钮点击多次执行我的api调用。
**应用的解决方案不起作用:**即使您尝试在onClick()后直接禁用按钮,仍有可能发生多次单击。

0tdrvxhp

0tdrvxhp1#

解决Android的多次点击问题-Kotlin

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

步骤1:创建名为SafeClickListener.kt的类

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()
}
xxls0lw8

xxls0lw82#

您可以使用下面的代码来完成该任务:

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
    }
}
az31mfrm

az31mfrm3#

//its work same as setOnClickListener  
//Create Function Like this in Utils File
                        
fun View.setOnclick(listenerBlock: OnDebounceClickListener) =
  setOnClickListener(MulticlickPrevent(1000L, listenerBlock))

interface OnDebounceClickListener {
    fun onClick(view: View?)
}

class MulticlickPrevent(
    private val interval: Long,
    private val listenerBlock: OnDebounceClickListener
) : View.OnClickListener {
    private var LastClickListner = 0L

    override fun onClick(v: View) {
        val time = System.currentTimeMillis()
        if (time - LastClickListner >= interval) {
            LastClickListner = time
            listenerBlock.onClick(v)
        }
    }
}

//在像这样的活动上使用

myview.setOnclick(object : OnDebClickListener{
             override fun onClick(var1: View?) {
                       TODO("Do your code")
             }
     })
            
    //Or
    class MainActivity : Activity() , OnDebClickListener{
          //in onCreate method
          myview.setOnclick(this)
    }

相关问题