做項目的時候龙誊,經(jīng)常需要彈出彈出框,第一次我選擇了用Dialog來做趟大,第二次我用了Popupwindow來做鹤树,實現(xiàn)復雜度上都差不多。
其中最本質的差別就是:
????AlertDialog是非阻塞式對話框:AlertDialog彈出時魂迄,后臺還可以做事情;而PopupWindow是阻塞式對話框:PopupWindow彈出時惋耙,程序會等待捣炬,在PopupWindow退出前绽榛,程序一直等待湿酸,只有當我們調用了dismiss方法的后,PopupWindow退出灭美,程序才會向下執(zhí)行。
????這兩種區(qū)別的表現(xiàn)是:
AlertDialog彈出時届腐,背景是黑色的铁坎,但是當我們點擊背景,AlertDialog會消失硬萍,證明程序不僅響應AlertDialog的操作,還響應其他操作围详,其他程序沒有被阻塞朴乖,這說明了AlertDialog是非阻塞式對話框助赞;PopupWindow彈出時买羞,背景沒有什么變化,但是當我們點擊背景的時候雹食,程序沒有響應,只允許我們操作PopupWindow群叶,其他操作被阻塞吃挑。
因為許多地方都有彈框提示信息的需求钝荡,于是便自定義了一個PopupWindow類儒鹿,后來在華為7.0手機上popupwindow位置錯亂,其他機型當時沒有發(fā)現(xiàn)出來(可能由于我們公司機型少)几晤,后來重寫了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位置就正確顯示了蟹瘾。