PopuoWindow弹出时报BadTokenException的解决方案

来源:互联网 发布:itunes网络连接超时 编辑:程序博客网 时间:2024/05/14 10:03

完整的错误是

java.lang.RuntimeException: Unable to resume activity {*****}: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?                                                                   at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2797)                                                                   ...Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?                                                                   at android.view.ViewRootImpl.setView(ViewRootImpl.java:559)                                                 

 关键的是

BadTokenException: Unable to add window -- token null is not valid; is your activity running?

 总之…问题有两种可能性:你的Activity实例不在了,你依附的View不存在了。我遇到的是第二种情况,下面详细描述一下问题场景以及解决方案。

问题描述

 在某个场景,需要跳转到某个页面后立即弹出一个PopupWindow,所以第一个反应就是在onCreate中判断跳转,然后执行showAtLoaction..然后报错,当然我的第一反应就是View并没有加载好久执行操作了,于是将这个方法放到了onResumeonPostResume中..然而并没有用。
 StackOverFlow中给出的解释是:

To avoid BadTokenException, you need to defer showing the popup until after all the lifecycle methods are called (-> activity window is displayed):

 只是解决问题的话…这个方法是不能在Activity的生命周期方法中调用的..所以需要在所有的生命周期方法执行后才可以调用。具体的解决方案是:写一个方法:

 findViewById(R.id.main_page_layout).post(new Runnable() {   public void run() {     pw.showAtLocation(findViewById(R.id.main_page_layout), Gravity.CENTER, 0, 0);   }});

 这个方法会在所有的生命周期方法调用后才执行,这样就能安全地调用PopupWindow了。
 另外还有一个方法是在onWindowFocusChanged中调用,但是这样…总感觉有点取巧。

一点反思

 面向百度,面向谷歌和面向StackOverflow编程总是好的,不过有时间应该看下WindowManager以及Activity的加载机制,是如何绘制界面和事件触发的。

0 0
原创粉丝点击