PopupWindow注意事项

本文分享了作者在Android开发中使用PopupWindow遇到的问题及解决方案,包括如何精确控制PopupWindow的显示位置、解决含有ListView的PopupWindow宽度不可控问题,以及如何改变PopupWindow的背景颜色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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());

经过上面三个坑之后,我的popupwindow终于以我满意的样式显示在了我希望他显示的位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值