防止Android点击按钮过快造成多次事件实现原理

自定义一个NoDoubleClickListener类,实现OnClickListener接口:

public abstract  class  NoDoubleClickListener  implements View.OnClickListener{privatestaticlonglastClickTime =0;publicstaticfinalintMIN_CLICK_DELAY_TIME =700;publicabstractvoidonNoDoubleClick(View view);@OverridepublicvoidonClick(View v) {longcurrentTime = Calendar.getInstance().getTimeInMillis();if(currentTime - lastClickTime > MIN_CLICK_DELAY_TIME) {            lastClickTime = currentTime;            onNoDoubleClick(v);        }    }}


使用NoDoubleClickListener代替OnClickListener来实现点击事件:

mbutton.setOnClickListener(newNoDoubleClickListener() {@OverrideprotectedvoidonNoDoubleClick(View v) {            doSomeThing();        }    });}


实现原理:

1. 在View的setOnClickListener中可以看到OnClickListener的对象赋值给了getListenerInfo().mOnClickListener

publicvoidsetOnClickListener(@Nullable OnClickListener l) {if(!isClickable()) {        setClickable(true);    }    getListenerInfo().mOnClickListener = l;}


2. 在View类的performClick()中会调用mOnClickListener.onClick()方法

publicbooleanperformClick() {finalbooleanresult;finalListenerInfo 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);returnresult;}


3. 调用View的onClick()后,就会回调NoDoubleClickListener中的onClick()方法,经过按键防抖处理后再回调onNoDoubleClick()方法

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容