为了防止view的点击事件,在短时间内多次点击从而触发了多次处理操作,确保只有最后一次点击生效。可以通过延迟处理点击事件,如果在设定的时间内再次点击,则取消之前的点击事件,只处理最后一次点击。
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import androidx.annotation.NonNull;
import java.lang.ref.WeakReference;
public class ClickHandlerHelper {
private static final int DEFAULT_CLICK_DELAY = 300; // 默认延迟处理的时间,单位毫秒
private static class InstanceHolder {
private static final ClickHandlerHelper INSTANCE = new ClickHandlerHelper();
}
private final Handler clickHandler;
private int clickDelay = DEFAULT_CLICK_DELAY;
private ClickHandlerHelper() {
this.clickHandler = new Handler(Looper.getMainLooper(), new ClickHandlerCallback());
}
public static ClickHandlerHelper getInstance() {
return InstanceHolder.INSTANCE;
}
public void setClickDelay(int delay) {
this.clickDelay = delay;
}
public void onSingleClick(@NonNull final View view, @NonNull final View.OnClickListener listener) {
clickHandler.removeMessages(0);
Message msg = clickHandler.obtainMessage(0, new ClickData(view, listener));
clickHandler.sendMessageDelayed(msg, clickDelay);
}
private static class ClickHandlerCallback implements Handler.Callback {
@Override
public boolean handleMessage(Message msg) {
if (msg.what == 0 && msg.obj instanceof ClickData) {
ClickData clickData = (ClickData) msg.obj;
View view = clickData.view.get();
View.OnClickListener listener = clickData.listener.get();
if (view != null && listener != null) {
view.setOnClickListener(listener);
}
}
return true;
}
}
private static class ClickData {
private final WeakReference<View> view;
private final WeakReference<View.OnClickListener> listener;
public ClickData(View view, View.OnClickListener listener) {
this.view = new WeakReference<>(view);
this.listener = new WeakReference<>(listener);
}
}
}
使用如下
ClickHandlerHelper.getInstance().setClickDelay(500); // 设置延迟时间为500毫秒
// 调用 onSingleClick 方法,使用默认或修改后的延迟时间
ClickHandlerHelper.getInstance().onSingleClick(button, new View.OnClickListener() {
@Override
public void onClick(View v) {
// 处理最后一次点击事件
showToast("Last click processed");
}
});