Androidボタンのクリックが速すぎて複数回のイベントが発生することを防止する原理
3510 ワード
NoDoubleClickListenerクラスをカスタマイズし、OnClickListenerインタフェースを実装します.
クリックイベントは、OnClickListenerの代わりにNoDoubleClickListenerを使用して実現します.
実現原理:
1.ViewのsetOnClickListenerでは、OnClickListenerのオブジェクトがgetListener Info()に付与されていることがわかる.mOnClickListener
2.ViewクラスのperformClick()でmOnClickListenerが呼び出されます.onClick()メソッド
3.ViewのonClick()を呼び出すと、NoDoubleClickListenerのonClick()メソッドがコールバックされ、ボタンブレ防止処理後にonNoDoubleClick()メソッドがコールバックされる
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);
}
}
}
クリックイベントは、OnClickListenerの代わりにNoDoubleClickListenerを使用して実現します.
mbutton.setOnClickListener(new NoDoubleClickListener() {
@Override
protected void onNoDoubleClick(View v) {
doSomeThing();
}
});
}
実現原理:
1.ViewのsetOnClickListenerでは、OnClickListenerのオブジェクトがgetListener Info()に付与されていることがわかる.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()メソッドがコールバックされる