android - 避免按钮多次快速点击

标签 android

我的应用程序有一个问题,如果用户快速多次单击按钮,那么在我按住按钮的对话框消失之前就会生成多个事件

我知道一个解决方案,方法是在单击按钮时将 bool 变量设置为标志,以便在关闭对话框之前可以防止以后的单击。但是,我有很多按钮,并且每次都必须为每个按钮都这样做似乎是一种矫枉过正。 android(或者可能是一些更智能的解决方案)中是否没有其他方法只允许每次单击按钮生成的事件操作?

更糟糕的是,在处理第一个操作之前,多次快速点击似乎会生成多个事件操作,所以如果我想在第一次点击处理方法中禁用按钮,队列中已经存在事件操作等待处理!

请帮忙 谢谢

最佳答案

这是我最近写的一个“去抖动”的 onClick 监听器。 你告诉它两次点击之间可接受的最小毫秒数是多少。 在 onDebouncedClick 而不是 onClick

中实现您的逻辑
import android.os.SystemClock;
import android.view.View;

import java.util.Map;
import java.util.WeakHashMap;

/**
 * A Debounced OnClickListener
 * Rejects clicks that are too close together in time.
 * This class is safe to use as an OnClickListener for multiple views, and will debounce each one separately.
 */
public abstract class DebouncedOnClickListener implements View.OnClickListener {

    private final long minimumIntervalMillis;
    private Map<View, Long> lastClickMap;

    /**
     * Implement this in your subclass instead of onClick
     * @param v The view that was clicked
     */
    public abstract void onDebouncedClick(View v);

    /**
     * The one and only constructor
     * @param minimumIntervalMillis The minimum allowed time between clicks - any click sooner than this after a previous click will be rejected
     */
    public DebouncedOnClickListener(long minimumIntervalMillis) {
        this.minimumIntervalMillis = minimumIntervalMillis;
        this.lastClickMap = new WeakHashMap<>();
    }

    @Override 
    public void onClick(View clickedView) {
        Long previousClickTimestamp = lastClickMap.get(clickedView);
        long currentTimestamp = SystemClock.uptimeMillis();

        lastClickMap.put(clickedView, currentTimestamp);
        if(previousClickTimestamp == null || Math.abs(currentTimestamp - previousClickTimestamp) > minimumIntervalMillis) {
            onDebouncedClick(clickedView);
        }
    }
}

关于android - 避免按钮多次快速点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16534369/

相关文章:

android - 如何在 Android 设备上直接将简单的 C++ 程序作为可执行文件运行?

android - 我们如何从我的 Android 应用程序执行 shell 脚本文件

android - 区分Android上的开发模式和 Release模式环境设置

android - 在创建 ViewModelProvider 实例时将“this”和 "activity!!"作为 ViewModelStoreOwner 传递有什么区别

android - 高速公路不适用于 tomcat 7 websocket

android - 无法解决Android Studio 3.1.3中的Gradle同步失败(4.4级)

android - JAVA_HOME 与 Android SDK 冲突

java - android 中的基本身份验证错误 "HTTP/1.1 401 Unauthorized"- EWS 2010

android - 媒体播放器服务安卓

android - 如何在 Android ListActivity 中调用 onContentChanged 时关闭列表滚动?