Androidボタンのクリックが速すぎて複数回のイベントが発生することを防止する原理

3510 ワード

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);
        }
    }
}

クリックイベントは、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()メソッドがコールバックされる