これはあなたの仕事とは関係ありません。
オーバーフローメニューはPopupWindowによって実装されます。ユーザーがタッチしてPopupWindowを閉じると、ACTION_DOWNイベントがアプリのメッセージキューにキューイングされます。次に、ViewPostImeInputStageクラスを介してViewに配信され、最後にViewPostImeInputStageがこの入力イベントをPopupWindowのonTouchEventリスナーに送信します。
@Override
public boolean onTouchEvent(MotionEvent event) {
final int x = (int) event.getX();
final int y = (int) event.getY();
if ((event.getAction() == MotionEvent.ACTION_DOWN)
&& ((x < 0) || (x >= getWidth()) || (y < 0) || (y >= getHeight()))) {
dismiss();
return true;
} else if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
dismiss();
return true;
} else {
return super.onTouchEvent(event);
}
}
dissmiss()は、PopupWindowとPopupWindow :: onDetachedWindowを閉じようとし、最初にWindowInputEventReceiver :: dispose()を呼び出します。
次に、ViewPostImeInputStageがWindowInputEventReceiver :: finishInputEventを呼び出して、そのACTION_DOWNイベントを終了します。ただし、WindowInputEventReceiverインスタンスはすでに破棄されているため、警告メッセージがスローされます。
ブレークポイントでデバッグできます。InputEventReceiver.java(framework / base /にAndroidソースコードが必要)を開き、disposeメソッドにブレークポイントを設定します。