PopupWindow空指针异常的解决方案

错误1:

java.lang.NullPointerException

at android.widget.PopupWindow$1.onScrollChanged(PopupWindow.java:127)

at android.view.ViewTreeObserver.dispatchOnScrollChanged(ViewTreeObserver.java:607)

at android.view.ViewRoot.draw(ViewRoot.java:1453)

at android.view.ViewRoot.performTraversals(ViewRoot.java:1335)

at android.view.ViewRoot.handleMessage(ViewRoot.java:1991)

at android.os.Handler.dispatchMessage(Handler.java:99)

at android.os.Looper.loop(Looper.java:150)

at android.app.ActivityThread.main(ActivityThread.java:4385)

at java.lang.reflect.Method.invokeNative(Native Method)

at java.lang.reflect.Method.invoke(Method.java:507)

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)

at dalvik.system.NativeStart.main(Native Method)

这个错误经常出现在 Gingerbread或更早的版本,3.0以下。是系统的bug

解决方案:

new PopupWindow之后加上如下的方法进行检查即可,为了兼容3.0以下版本,这个操作还是必要的

private void fixPopupWindow(final PopupWindow window) {

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {

        try {

            final Field fAnchor = PopupWindow.class

                    .getDeclaredField("mAnchor");

            fAnchor.setAccessible(true);

            Field listener = PopupWindow.class

                    .getDeclaredField("mOnScrollChangedListener");

            listener.setAccessible(true);

            final ViewTreeObserver.OnScrollChangedListener originalListener = (ViewTreeObserver.OnScrollChangedListener) listener

                    .get(window);

            ViewTreeObserver.OnScrollChangedListener newListener = new ViewTreeObserver.OnScrollChangedListener() {

                @Override

                public void onScrollChanged() {

                    try {

                        WeakReference<View> mAnchor = (WeakReference<View>) fAnchor.get(window);

                        if (mAnchor == null || mAnchor.get() == null) {

                            return;

                        } else {

                            originalListener.onScrollChanged();

                        }

                    } catch (IllegalAccessException e) {

                        e.printStackTrace();

                    }

                }

            };

            listener.set(window, newListener);

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

参考:

https://github.com/JakeWharton/ActionBarSherlock/issues/752

https://groups.google.com/forum/?fromgroups=#!msg/osmeditor4android/RsHYoY6XqlU/-WGSKWm5OMAJ

错误2:

java.lang.NullPointerException

 at android.widget.PopupWindow$PopupViewContainer.dispatchKeyEvent(PopupWindow.java:1426)

 at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2627)

 at android.view.ViewRoot.deliverKeyEvent(ViewRoot.java:2592)

 at android.view.ViewRoot.handleMessage(ViewRoot.java:1881)

 at android.os.Handler.dispatchMessage(Handler.java:99)

 at android.os.Looper.loop(Looper.java:130)

 at android.app.ActivityThread.main(ActivityThread.java:3687)

 at java.lang.reflect.Method.invokeNative(Native Method)

 at java.lang.reflect.Method.invoke(Method.java:507)

 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)

 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)

 at dalvik.system.NativeStart.main(Native Method)

解决方法:创建PopupWindow 的时候不调用 setFocusable(true),在showAtLocation后在调用setFocusable(true);并且在 dismiss的时候 调用setFocusable(false)

参考:

http://stackoverflow.com/questions/7768728/popupwindow-crash-on-dispatch-event

http://www.eoeandroid.com/thread-109193-1-1.html


转载于:https://my.oschina.net/u/1244156/blog/265117

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值