如何防止按钮双击

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)

【讨论】:

以上是关于如何防止按钮双击的主要内容,如果未能解决你的问题,请参考以下文章

React Native 防止双击

如何使用表单验证防止重复提交

Android防止双击微调器

如何修改mssql2000的sa密码?

防止 UIWebview 上的捏缩放和双击缩放

如何防止在PhoneGap中双击移动滚动?