在开发的过程中我们总是遇到各种各样的问题,今天我就在这里记录一下今天遇到的问题:
06-05 16:39:51.041 31991-31991/com.dde56.consignee E/AndroidRuntime: FATAL EXCEPTION: main Process: com.dde56.consignee, PID: 31991 android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application at android.view.ViewRootImpl.setView(ViewRootImpl.java:677) at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:282) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85) at android.app.Dialog.show(Dialog.java:319) at android.widget.Spinner$DialogPopup.show(Spinner.java:1015) at android.widget.Spinner.performClick(Spinner.java:683) at android.view.View$PerformClick.run(View.java:19907) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:159) at android.app.ActivityThread.main(ActivityThread.java:5541) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:975) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:770)
问题分析:出现上述问题的原因是我在代码里面写了一段这样的代码-- View contentView = LayoutInflater.from(LPApp.getInstance()).inflate(R.layout.goods_window, null); 顺便贴一下goods_window布局文件:?xml version="1.0" encoding="utf-8"?
这个布局文件里面有个spinner控件,当我点击spinner的时候就报了上述错误(这个时候spinner自带的选择下拉图片是灰色的,点一下就崩溃)。
解决方法是将View contentView = LayoutInflater.from(LPApp.getInstance()).inflate(R.layout.goods_window, null);这句代码里面的LPApp.getInstance()获得的ApplicationContext换成Activity对象就解决了,其实在开发的时候经常会遇到android.view.WindowManager$BadTokenException这样的异常,其实像AlertDialog,Dialog和Spinner这样的控件经常会遇到这样的问题,解决方法就是找到自定义dialog和spinner里面的Application类型的Context然后替换为Activity类型的Context对象,最后因为里面引用了Actvitiy的对象,最好在自定义的dialog或者spinner里面写一个destroyDialog的方法,在Activity走onDestroy的时候去调用这个destroyDialog方法释放掉activity对象,就是将传入到dialog或者spinner里面的context=null就可以了,说完了,搞得我好像有对象似得,还要把它释放掉,如果你也遇到了上面同样的异常,但是和我说的情况不一致,这个时候我就给你推荐一本书了《Android开发艺术探索》里面有个小结专门讲这种异常的,参考一下。
哎!老婆又喊我洗碗去了,她只允许我吃牛5分钟,现在吹完了。