在开发的过程中我们总是遇到各种各样的问题,今天我就在这里记录一下今天遇到的问题:
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"?>
<LinearLayout xmlns:android=" http://schemas.android.com/apk/res/android" ;android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/spinnerLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_marginTop="7dp"
android:background="@drawable/add_goods_layout_shape"
android:paddingBottom="6dp"
android:paddingLeft="13dp"
android:paddingTop="10dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/GoodsPackageType"
android:textColor="#2f90e7"
android:textSize="15sp" />
<Spinner
android:id="@+id/packageTypeSp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:spinnerMode="dialog" />
</RelativeLayout>
</LinearLayout>
这个布局文件里面有个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开发艺术探索》里面有个小结专门讲这种异常的,参考一下。