Android view防止快速点击

153 阅读1分钟

为了防止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");
    }
});