欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

解决常见的android.view.WindowManager$BadTokenException

程序员文章站 2024-03-20 15:20:58
...

转载自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2013/0304/963.html

如题:在activity的oncreate方法中使用popupwindow出现以下错误:
android.view.WindowManager$BadTokenException: Unable to add window --
token null is not valid; is your activity running?

错误代码如下 :

pop = new PopupWindow(pop_view,320,250); 
pop.showAtLocation(parent, Gravity.TOP,0, 0);


应把pop.showAtLocation(parent, Gravity.TOP,0, 0)这一句移出oncreate方法,在控件渲染完毕后再使用。

但是移出oncreate方法的话该移到哪里去呢?网友的方法大概是这几种:

1、移到事件中(比如一个button的click事件中);
2、移到子线程中;另起一线程,在线程中不断循环,直到判断控件是否渲染完毕(如长宽大于0),不推荐。。。
3、移到重写的控件(parent)中,在控件ondraw()完后生成pop。
ps:1、2绝对没问题,3没测试过。

推荐的解决方法:

后来在网上找到一个绝佳的方法:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
 // TODO Auto-generated method stub
 super.onWindowFocusChanged(hasFocus);
 if(hasFocus){
  showPopupWindow(getApplicationContext());
 }
}


其中showPopupWindow(getApplicationContext())是我自己定义的专门显示popupwindow的一个函数。

当activity获得焦点之后,activity是加载完毕的了,在这里处理view就不会再抛错


另一种抛错

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application

解决常见的android.view.WindowManager$BadTokenException

一般出错的原因都在于传入的context是application而不是activity,这里传入activity对象则可以解决这个问题。

参照自:http://blog.csdn.net/crash163/article/details/51829341