在Android 4.1.x上取消ActionBar Overflow菜单时发出警告

时间:2013-03-02 14:02:53

标签: android warnings android-optionsmenu

这是我收到的警告:

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

详细处理事件

当我点击垂直的三个点打开溢出菜单并取消它时,我收到了警告。似乎很少知道如何抓住它的触发器。有什么想法吗?

1 个答案:

答案 0 :(得分:14)

这与您的工作无关。

溢出菜单由PopupWindow实现。当用户触摸以关闭PopupWindow时,ACTION_DOWN事件排队到app的Message队列。然后通过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方法中设置断点。