PopupWindow在外面的觸摸事件通知相同的方式,對所有其他觸摸事件。當標記設置在路由到彈出窗口的事件之外時,您可以像處理觸摸一樣處理它們。沒有特殊的方法來測試這種外部事件或爲這類事件設置監聽器。如果你檢查源代碼:
1341 @Override
1342 public boolean dispatchTouchEvent(MotionEvent ev) {
1343 if (mTouchInterceptor != null && mTouchInterceptor.onTouch(this, ev)) {
1344 return true;
1345 }
1346 return super.dispatchTouchEvent(ev);
1347 }
1348
1349 @Override
1350 public boolean onTouchEvent(MotionEvent event) {
1351 final int x = (int) event.getX();
1352 final int y = (int) event.getY();
1353
1354 if ((event.getAction() == MotionEvent.ACTION_DOWN)
1355 && ((x < 0) || (x >= getWidth()) || (y < 0) || (y >= getHeight()))) {
1356 dismiss();
1357 return true;
1358 } else if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
1359 dismiss();
1360 return true;
1361 } else {
1362 return super.onTouchEvent(event);
1363 }
1364 }
現在你可以看到PopupWindow自身檢查該事件的X/Y在外面或解散本身。所以你可以設置TouchInterceptor來捕獲事件之前或者默認處理程序。或者你可以重寫onTouchEvent來做你自己的事件處理,如果它對你有意義的話,可以調用super。
要添加到此,show ..方法(showAtLocation或ShowAsDropDown)應在上述答案後調用,而不是在兩者之間。 – Thupten 2014-11-03 15:58:26
'if(event.getAction()== MotionEvent。ACTION_OUTSIDE)'總是不是真的,因爲每次它是MotionEvent.ACTION_DOWN,因此這個解決方案不起作用,更好的解決方案是設置OnDismissListener,每次在窗口外單擊時都會調用它。我已經添加了這個作爲答案 – 2017-06-09 07:44:12