PopupWindow嵌套PopupWindow时报Unable to add window的处理
当我们在开发Android应用时,有时候需要在一个PopupWindow里面再嵌套另一个PopupWindow,这种嵌套使用频率相对较低,但是当需要使用时却可能会触发以下异常:
android.view.WindowManager$BadTokenException:Invalied token.
在调试过程中以及网络上的解决方案中,我们通常会看到这个异常的提示Unable to add window - token null is not valid. is your activity running? 在解决这个问题之前,让我们先来了解一下这个异常的原因以及可能的解决方案。
**异常原因:**
说到这个异常的原因,实际上很简单,就是因为PopupWindow嵌套PopupWindow时,上层PopupWindow所依赖的窗口(Window)失去了拥有者。正常情况下,一个PopupWindow的窗口是依附于其拥有者的,而拥有者一般都是Activity。当嵌套的PopupWindow没有合适的依附者时,就会抛出异常。
**解决方案:**
解决这个问题,我们需要为上层PopupWindow指定一个合适的依附者。具体可采用以下两种方法:
1.在嵌套PopupWindow时,将上层PopupWindow依附于下层PopupWindow所依附的view上,而不是Activity上。这样上层PopupWindow的窗口就可以通过下层PopupWindow依附的窗口来找到合适的依附者。
示例代码:
PopupWindow popupWindow1 = new PopupWindow(view1,width,height); popupWindow1.showAsDropDown(view2); PopupWindow popupWindow2 = new PopupWindow(view3,width,height); popupWindow2.showAsDropDown(view4);
2.在嵌套PopupWindow时,可以将上层PopupWindow依附于Activity上,但不使用默认的依附方式(showAtLocation,showAsDropDown等),而是使用另外一个方法showAsDropDown(anchor, xoff, yoff, gravity),其中anchor是下层PopupWindow所依附的view,xoff和yoff是显示位置的偏移量,gravity是显示位置的重心。
示例代码:
PopupWindow popupWindow1 = new PopupWindow(view1, width, height); PopupWindow popupWindow2 = new PopupWindow(view3, width, height); popupWindow1.showAtLocation(parent, Gravity.NO_GRAVITY, 0, 0); popupWindow2.showAsDropDown(view4, 0, 0);
需要注意的是,在使用第二种方法时,一定要确保下层PopupWindow已经显示,因为只有这样才能确定上层PopupWindow的显示位置。
**总结:**
以上就是关于PopupWindow嵌套PopupWindow时报Unable to add window的处理方法, 对于这个异常,我们应该理解其中的原因,选择适合自己的解决方案,才能更好地完成我们的开发工作。
