【问题标题】: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/… 并禁用按钮即点击触发

标签: android onclicklistener android-button double-click


【解决方案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)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-01
        • 2018-06-14
        • 2016-09-05
        • 1970-01-01
        • 1970-01-01
        • 2016-08-03
        • 2015-10-17
        • 2010-09-08
        相关资源
        最近更新 更多