防止Android点击按钮过快造成多次事件实现原理
16lz
2022-04-19
自定义一个NoDoubleClickListener类,实现OnClickListener接口:
public abstract class NoDoubleClickListener implements View.OnClickListener { private static long lastClickTime = 0; public static final int MIN_CLICK_DELAY_TIME = 700; public abstract void onNoDoubleClick(View view); @Override public void onClick(View v) { long currentTime = Calendar.getInstance().getTimeInMillis(); if (currentTime - lastClickTime > MIN_CLICK_DELAY_TIME) { lastClickTime = currentTime; onNoDoubleClick(v); } }}
使用NoDoubleClickListener代替OnClickListener来实现点击事件:
mbutton.setOnClickListener(new NoDoubleClickListener() { @Override protected void onNoDoubleClick(View v) { doSomeThing(); } });}
实现原理:
1. 在View的setOnClickListener中可以看到OnClickListener的对象赋值给了getListenerInfo().mOnClickListener
public void setOnClickListener(@Nullable OnClickListener l) { if (!isClickable()) { setClickable(true); } getListenerInfo().mOnClickListener = l;}
2. 在View类的performClick()中会调用mOnClickListener.onClick()方法
public boolean performClick() { final boolean result; final ListenerInfo li = mListenerInfo; if (li != null && li.mOnClickListener != null) { playSoundEffect(SoundEffectConstants.CLICK); li.mOnClickListener.onClick(this); result = true; } else { result = false; } sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED); return result;}
3. 调用View的onClick()后,就会回调NoDoubleClickListener中的onClick()方法,经过按键防抖处理后再回调onNoDoubleClick()方法
更多相关文章
- Android中RadioGroup RadioButton CheckBox多选按钮实现方法以及
- Android(安卓)各种音量的获取和设置
- Android:媒体按键消息
- Android中全屏无标题设置
- Android之TabHost的几种使用方法
- android MVVM ItemViewSelector 实现列表中不同的view类型
- Android(安卓)获得当前进程PackageName
- 浅谈Java中Collections.sort对List排序的两种方法
- Python list sort方法的具体使用