1. 程式人生 > >Android dialog和popupwiondow的區別

Android dialog和popupwiondow的區別

其中最本質的差別就是:AlertDialog是非阻塞式對話方塊:AlertDialog彈出時,後臺還可以做事情;而PopupWindow是阻塞式對話方塊:PopupWindow彈出時,程式會等待,在PopupWindow退出前,程式一直等待,只有當我們呼叫了dismiss方法的後,PopupWindow退出,程式才會向下執行。這兩種區別的表現是:AlertDialog彈出時,背景是黑色的,但是當我們點選背景,AlertDialog會消失,證明程式不僅響應AlertDialog的操作,還響應其他操作,其他程式沒有被阻塞,這說明了AlertDialog是非阻塞式對話方塊;PopupWindow彈出時,背景沒有什麼變化,但是當我們點選背景的時候,程式沒有響應,只允許我們操作PopupWindow,其他操作被阻塞。

(此段說明從網上技術文件看來的,自己沒有程式碼嘗試也沒看原始碼,真實性無法確定)

 

PopupWindow的簡單用法

1.建立

2.設定

3.顯示

//建立
PopupWindow popupWindow = new PopupWindow(this);

//設定
popupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);   
popupWindow.setContentView(LayoutInflater.from(this).inflate(R.layout.dialog_item01, null));
popupWindow.setOutsideTouchable(false);
popupWindow.setFocusable(true);
popupWindow.setTouchable(true);
popupWindow.setBackgroundDrawable(new ColorDrawable(Color.WHITE));

//顯示在控制元件下面
popupWindow.showAsDropDown(buttonUseCar);
//顯示父控制元件中的指定位置
popupWindow.showAtLocation(cl,Gravity.TOP | Gravity.LEFT, 0, 100);

首先,我們要明確一點,點選到彈窗上的touch事件是首先傳遞到彈窗上的,如果你設定了touchable為true,那麼當前彈窗則會消耗掉touch事件,當前的activity則不會再收到touch事件,反之則會收到事件。

 

關於focusable的設定

foucsable設定為true,彈窗在彈出後就獲取到了焦點,焦點的獲取,就告訴裝置,外部按鍵事件向哪裡傳遞。如果彈窗獲取到了焦點,此時點選外部按鍵,按鍵事件是直接傳遞給彈窗的。需要注意的是設定focusable為true,並不代表這個控制元件就獲取到了焦點,而是表示可以獲取焦點。


 

PopupWindow 設定點選外部區域不消失

https://blog.csdn.net/yh18668197127/article/details/84986793


參考

https://www.jianshu.com/p/e588d74b5c9f