android开发中,在activity中显示弹窗的方式有很多,最常用的是dialog,除此之外,我知道的还有activity,fragment , popUpwindow也都可以实现。甚至于最初级的开发者可以不考虑使用弹窗,直接将要弹出的内容写入布局并隐藏,在触发响应事件后,以view的形式显示,添加显示动画,也可以出现类似的效果。
本文主要记录了使用popupwindow过程中遇到的三个坑:
1.如何让popupwindow显示在指定坐标的相对位置?
这个时候,你必须要对popupwindow自身的宽高进行测量,才能够得到弹窗要显示的绝对坐标。
在定义popupwindow对象时候,如果你使用new popUpWindow(layout , widh , height )这个构造方法方法,那么你可能不会遇到这个坑,因为你一定为这个对象设置了大小。这个坑的产生原因就在于,在popupwindow布局中所有控件的属性都是wrap_content ,在显示之前你不会知道这个弹窗的宽高,而要显示弹窗,你还必须要知道弹窗宽高,死循环啊。。。。
解决方法是强制绘制弹窗(绘制不代表显示)
View content = LayoutInflater.from(context).inflate(layout ,null);//弹窗布局
content.measure(View.MeasureSpec.UNSPECIFIED , View.MeasureSpec.UNSPECIFIED);
width = content.getMeasureWidth();
height = content.getMeasureHeight();
popupWindow.setWidth(width);
popupWindow.setHeight(height);
如此,这个坑算是填上了
2.布局中含有ListView的popupWindow弹窗,宽度无法控制。
如果你的popupWindow布局中不巧有个listview,那么呵呵,上面那个方法可能并不能让你获取到想要的宽度,你的popupwindow显示出来后,可能会占据全屏,或者比你想要的宽度要宽一些,如果你想将宽高写死,在不同的手机上的显示效果会让你痛不欲生。这时候,可以先获取listView的宽度,然后加上一个定值,使宽度看上去更合适一些
listview.measure(View.MeasureSpec.UNSPECIFIED , View.MeasureSpec.UNSPECIFIED);
width
= listview.getMeasureWidth + 100;
//100是一个估计值,可以试着调整
popupWindow.setWidth(width);
3.popupWindow背景为暗灰色
我几度修改布局中的layout背景色,使整个弹窗显示的更有亲和力一些。可惜不好使,后来才意识到,这个与我的布局无关,是popupWindow自带的背景色。加一行代码:
popupWindow.setBackGroundDrawable(new BitmapDrawable());
本文分享了作者在Android开发中使用PopupWindow遇到的问题及解决方案,包括如何精确控制PopupWindow的显示位置、解决含有ListView的PopupWindow宽度不可控问题,以及如何改变PopupWindow的背景颜色。
2026

被折叠的 条评论
为什么被折叠?



