onCreate方法中调用PopupWindow的错误:android.view.WindowManager$BadTo

泡在网上的日子 / 文 发表于2013-03-04 22:44 次阅读 popupwindow

如题:在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是加载完毕的了,这个方法的技巧性比较强,很难想到。

具体可以参考这篇文章。


收藏 赞 (6) 踩 (2)
上一篇:Android各种屏幕的分布率以及自适应各种屏幕的开发研究
下图表明了现在持有Android设备的屏幕分辨率的大概的一个分布,从中可看到mdpi跟hdpi的nomal分类占据了84%!所以我们的程序最开始要尽量适应这俩种设备。 Data collected during a 7-day period ending on May 1, 2012 ldpi mdpi hdpi xhdpi small 2.3% 2.4%
下一篇:如何监控一个Activity加载完毕(完成渲染)-onWindowFocusChanged
我也不知道是不是专门用来监控Activity的。但通过这个事件可以实现当一个Activity完全加载完毕后,然后就执行。 @Override public void onWindowFocusChanged(boolean hasFocus) { // TODO Auto-generated method stub super.onWindowFocusChanged(hasFocus)