转载自: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
一般出错的原因都在于传入的context是application而不是activity,这里传入activity对象则可以解决这个问题。
参照自:http://blog.csdn.net/crash163/article/details/51829341