做项目的时候,经常需要弹出弹出框,第一次我选择了用Dialog来做,第二次我用了Popupwindow来做,实现复杂度上都差不多。
其中最本质的差别就是:
AlertDialog是非阻塞式对话框:AlertDialog弹出时,后台还可以做事情;而PopupWindow是阻塞式对话框:PopupWindow弹出时,程序会等待,在PopupWindow退出前,程序一直等待,只有当我们调用了dismiss方法的后,PopupWindow退出,程序才会向下执行。
这两种区别的表现是:
AlertDialog弹出时,背景是黑色的,但是当我们点击背景,AlertDialog会消失,证明程序不仅响应AlertDialog的操作,还响应其他操作,其他程序没有被阻塞,这说明了AlertDialog是非阻塞式对话框;PopupWindow弹出时,背景没有什么变化,但是当我们点击背景的时候,程序没有响应,只允许我们操作PopupWindow,其他操作被阻塞。
因为许多地方都有弹框提示信息的需求,于是便自定义了一个PopupWindow类,后来在华为7.0手机上popupwindow位置错乱,其他机型当时没有发现出来(可能由于我们公司机型少),后来重写了PopupWindow类的showAsDropDown()方法,代码如下:
@Override
public void showAsDropDown(View anchor, int xoff, int yoff) {
if (Build.VERSION.SDK_INT >= 24) {
Rect rect = new Rect();
anchor.getGlobalVisibleRect(rect);
int h = anchor.getResources().getDisplayMetrics().heightPixels - rect.bottom;
setHeight(h);
}
super.showAsDropDown(anchor, xoff, yoff);
}
这样PopupWindow位置就正确显示了。
网友评论