PopupWindow在调度事件中崩溃

时间:2011-10-14 13:58:23

标签: android nullpointerexception popupwindow

我在使用PopupWindow android默认小部件时遇到了麻烦。 当我触摸按钮显示弹出窗口而不是按下手机上的后退按钮时,在显示弹出窗口之前,我有强制关闭消息,错误是下一步:



    10-14 16:51:53.389: ERROR/AndroidRuntime(3766): FATAL EXCEPTION: main
            java.lang.NullPointerException
            at android.widget.PopupWindow$PopupViewContainer.dispatchKeyEvent(PopupWindow.java:1342)
            at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2471)
            at android.view.ViewRoot.deliverKeyEvent(ViewRoot.java:2431)
            at android.view.ViewRoot.handleMessage(ViewRoot.java:1741)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:123)
            at android.app.ActivityThread.main(ActivityThread.java:4627)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:521)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
            at dalvik.system.NativeStart.main(Native Method)

所以,经过一些测试,我看到,这个bug在android< 2.3版本(2.1,2.2) 我也深入研究grepcode的来源,有方法:



        @Override
        public boolean dispatchKeyEvent(KeyEvent event) {
            if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
                if (event.getAction() == KeyEvent.ACTION_DOWN
                        && event.getRepeatCount() == 0) {
                    getKeyDispatcherState().startTracking(event, this);
                    return true;
                } else if (event.getAction() == KeyEvent.ACTION_UP
                        && getKeyDispatcherState().isTracking(event) && !event.isCanceled()) {
                    dismiss();
                    return true;
                }
                return super.dispatchKeyEvent(event);
            } else {
                return super.dispatchKeyEvent(event);
            }
        }

    ...

        public KeyEvent.DispatcherState getKeyDispatcherState() {
            return mAttachInfo != null ? mAttachInfo.mKeyDispatchState : null;
        }

和方法getKeyDispatcherState()返回null

有没有人解决过这个问题?

2 个答案:

答案 0 :(得分:1)

这个问题的焦点是你在Popupwindow显示之前将注意力集中在一起,所以dispatchevent会在你的活动之前收到反键,但是现在你的Popupwindow没有显示。您可以通过不将焦点放在Popupwindow上进行测试,您将理解我的意思。

答案 1 :(得分:0)

这是我认为的Android上的一个错误。

发表在这里: http://hg.mozilla.org/releases/mozilla-aurora/rev/caca38771162