Android Java自定义双击监听类单次点击未等待双击判断触发问题
问题修复方案
问题根因
你当前实现的逻辑是点击事件触发时立刻判断两次点击间隔,首次点击时lastClickTime初始值为0,两次点击间隔必然大于300ms,因此会直接触发onSingleClick回调,不会等待后续是否有第二次点击,这就是单次点击直接触发、双击事件无法正常响应的核心原因,同时如果快速双击还会出现单次、双击回调先后触发的异常问题。
修复后的实现代码
package com.programiner.studyvillaadmin.Classes.Listener; import android.os.Handler; import android.os.Looper; import android.view.View; import android.view.ViewConfiguration; public abstract class DoubleClickListener implements View.OnClickListener { // 推荐使用系统默认的双击间隔,更符合安卓用户通用使用习惯 private static final long DOUBLE_CLICK_TIME_DELTA = ViewConfiguration.getDoubleTapTimeout(); private final Handler mainHandler = new Handler(Looper.getMainLooper()); private boolean isFirstClick = true; @Override public void onClick(View v) { if (isFirstClick) { isFirstClick = false; // 延迟执行单次点击逻辑,等待判断是否有第二次点击 mainHandler.postDelayed(() -> { onSingleClick(v); isFirstClick = true; }, DOUBLE_CLICK_TIME_DELTA); } else { // 收到第二次点击,移除待执行的单次点击任务,直接触发双击回调 mainHandler.removeCallbacksAndMessages(null); onDoubleClick(v); isFirstClick = true; } } public abstract void onSingleClick(View v); public abstract void onDoubleClick(View v); }
注意事项
- 绑定监听的页面或控件销毁时,建议手动调用
mainHandler.removeCallbacksAndMessages(null)移除待执行的任务,避免内存泄漏 - 如果需要自定义双击间隔,直接替换
DOUBLE_CLICK_TIME_DELTA的取值即可,单位为毫秒
内容的提问来源于stack exchange,提问作者Crazy Gamerz
相关产品推荐
相关产品推荐

