需求內容:觸摸Dialog彈窗以外的區域,本Dialog消失且不影響彈窗以外的view控制元件回應觸摸事件,
實作方法:需要添加window的相應flag,并利用onTouchEvent回呼執行Dialog的消失機制,
實作代碼:
//設定window屬性(本例在onCreate函式中設定)
//觸摸Dialog外區域時,外區域view接收觸摸事件
getWindow().addFlags(WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
//觸摸Dialog外區域時通知Dialog觸摸事件
getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
//重寫onTouchEvent回呼,
@Override
public boolean onTouchEvent(@NonNull MotionEvent event) {
Log.i(TAG, "onTouchEvent: event = " + event.getAction());
if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
//接收到外部觸摸事件時執行相應處理邏輯(本例中執行window消失機制),
dismiss();
return true;
}
return super.onTouchEvent(event);
}
注意:
不要使用setOnTouchListener方法在onTouch回呼中監聽MotionEvent.ACTION_OUTSIDE事件,因為根本監聽不到,原因:setOnTouchListener是針對具體的觸摸view進行監聽,但觸摸window以外區域時不會傳遞到onTouch,而onTouchEvent監聽的是整個視窗行為,所以在onTouchEvent中能接收到MotionEvent.ACTION_OUTSIDE事件,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/233141.html
標籤:其他
