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
參考