如何防止按钮双击
Posted
技术标签:
【中文标题】如何防止按钮双击【英文标题】:How to prevent button double click 【发布时间】:2022-01-21 12:19:26 【问题描述】:我的活动中有一个按钮。当用户点击按钮时,会显示进度并向服务器发送请求,收到请求的响应后,会隐藏进度并打开下一个活动。 但是,如果用户有时间多次按下按钮,则会打开两个或更多活动。 为了防止双击,我使用 DebouncedOnClickListener。这是我的代码:
abstract class DebouncedOnClickListener protected constructor() : View.OnClickListener
private val minimumIntervalMillis: Long = 1000
private val lastClickMap: MutableMap<View, Long>
abstract fun onDebouncedClick(v: View?)
override fun onClick(clickedView: View)
val previousClickTimestamp = lastClickMap[clickedView]
val currentTimestamp = SystemClock.uptimeMillis()
lastClickMap[clickedView] = currentTimestamp
if (previousClickTimestamp == null || abs(currentTimestamp - previousClickTimestamp) > minimumIntervalMillis)
onDebouncedClick(clickedView)
init
lastClickMap = WeakHashMap()
这种方法在很多情况下都有效。但是,可以在未知的时间内处理该请求。并且用户可以在请求完成时点击按钮,进度将关闭,并开始打开下一个活动的过程。不知道一个新的activity可以启动多久,此时可以再次点击按钮,随后会导致两个activity的开启。
在活动打开之前如何避免双击,请帮助我。
附:即使我尝试禁用该按钮,在 Activity 启动期间仍然会发生双击
【问题讨论】:
我不太明白你遇到的问题,怎么会有人按两次?如果有人按下一个按钮,禁用它,显示加载,等待服务调用完成,然后处理api调用的响应,是不是很简单? 单击后禁用按钮,在 API 响应时重新启用 我更喜欢使用单击监听器developer.android.com/reference/android/view/… 并禁用按钮即点击触发 【参考方案1】:点击按钮粘贴即可
button.setEnabled(false);
【讨论】:
【参考方案2】:您可以使用如下的布尔标志。
private val onClicked: Boolean = false
override fun onClick(clickedView: View)
if(!onClicked)
onClicked = true
// Do something
onClicked = false
【讨论】:
【参考方案3】:在 Utils 中添加所需的函数,并通过将视图作为参数传递来调用它。
const val DIGIT_THOUSAND = 1000
fun preventMultipleTap(view: View)
preventMultipleTap(view, DIGIT_THOUSAND.toLong())
fun preventMultipleTap(view: View, delayInMillis: Long)
view.isEnabled = false
view.postDelayed( view.isEnabled = true , delayInMillis)
【讨论】:
以上是关于如何防止按钮双击的主要内容,如果未能解决你的问题,请参考以下文章