防止Android点击按钮过快造成多次事件实现原理
16lz
2021-01-23
自定义一个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将Uri转化为文件路径的方法
- android HTTP post方法时,如何使用cookies
- Android NDK之----- C调用Java [GetMethodID方法的使用]
- Android Support Multidex原理分析
- 一些常用SD卡操作的方法,APk管理之类的方法
- android 文件保存方法 sd卡中或系统
- 【Android】Zip文件解压方法
- Android显示GIF动画的几种方法