18

これは私が受け取っている警告です:

03-02 14:38:43.980: W/InputEventReceiver(3961): Attempted to finish an input event but the input event receiver has already been disposed.

私が持っているメニューは通常のres/menu/activity_menu.xmlファイルから生成されました。http://developer.android.com/guide/topics/ui/menus.html#options-menuで詳しく説明されているとおりにイベントを処理しています

縦の3つのドットをクリックしてオーバーフローメニューを開き、キャンセルすると、その警告が表示されます。その引き金を引く方法についての知識はほとんどないようです。何か案は?

4

1 に答える 1

14

これはあなたの仕事とは関係ありません。

オーバーフローメニューは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メソッドにブレークポイントを設定します。

于 2014-01-09T06:03:46.697 に答える