防止或避免 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)
}
如何防止用户多次点击一个按钮??。
实际问题: 如果用户持续快速点击按钮。单击按钮多次执行我的 api 调用。
应用的解决方案无效:即使您尝试在 onClick() 之后直接禁用按钮,仍然有可能发生多次点击。
解决Android多次点击问题 — Kotlin
我搜索了社区并找到了很棒的解决方案,比如创建一个自定义点击监听器,它将保留最后一次点击时间并在特定时间段内阻止点击 但是——作为 Kotlin 的忠实粉丝——我想通过 lambda 和闭包的强大功能来非常顺畅地使用一些东西。 所以我想出了这个实现,希望能帮到你
第 1 步:使用名称 SafeClickListener.kt
创建 classclass 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)
}