我的应用程序有一个问题,如果用户快速多次单击按钮,那么在我按住按钮的对话框消失之前就会生成多个事件
我知道一个解决方案,方法是在单击按钮时将 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/