2014-10-19 38 views
6

setOutsideTouchable(boolean touchable)設置爲true時,文檔指出PopupWindow將被通知其窗口外的觸摸事件。 popupwindow如何通知?我沒有看到像setOnOutsideTouchListener等任何聽衆收到該信息。PopupWindow如何得到觸及的外部事件通知?

PopupWindow popup = new PopupWindow(); 
popup.setOutsideTouchable(true); 
//now what..how to receive those touch outside events? 

感謝。

回答

7

嘗試使用setTouchInterceptor像下面的代碼snipt

popup.setTouchInterceptor(new OnTouchListener() 
    { 

     public boolean onTouch(View v, MotionEvent event) 
     { 
      if (event.getAction() == MotionEvent.ACTION_OUTSIDE) 
      { 
       popup.dismiss(); 
       return true; 
      } 

      return false; 
     } 
    }); 

也不要忘記設置thew以下標誌:

popup.setOutsideTouchable(true); 
+0

要添加到此,show ..方法(showAtLocation或ShowAsDropDown)應在上述答案後調用,而不是在兩者之間。 – Thupten 2014-11-03 15:58:26

+2

'if(event.getAction()== MotionEvent。ACTION_OUTSIDE)'總是不是真的,因爲每次它是MotionEvent.ACTION_DOWN,因此這個解決方案不起作用,更好的解決方案是設置OnDismissListener,每次在窗口外單擊時都會調用它。我已經添加了這個作爲答案 – 2017-06-09 07:44:12

0

「彈出式窗口是一個浮動容器,它出現在 當前活動的頂部。」

See: https://developer.android.com/reference/android/widget/PopupWindow.html 

我認爲這是你在找什麼。

+0

我知道彈出窗口是什麼。我的問題是具體關於setOutsideTouchable方法。 – Thupten 2014-10-20 05:43:46

+0

@Thupten我實際上並不確定它是如何得到通知的,但發現了這一點。 「 」控制彈出窗口是否會在其窗口外被通知觸摸事件。這僅適用於可觸摸但不可對焦的彈出窗口,這意味着觸摸窗口外的窗口將被傳遞到窗口後面。默認值爲false 如果彈出窗口顯示,調用此方法將僅在下次顯示彈出窗口或通過手動調用其中一個update()方法時生效。 希望這有助於一點。 – SkullDev 2014-10-20 12:03:44

0

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。

0

補充: 就我而言,如果我點擊popupWindow外的EditText, 如果setFocusable(真),event.getAction()== 0(所以我要雙擊EDITTEXT輸入。) 如果setFocusable(false,event.getAction()== 4(MotionEvent.ACTION_OUTSIDE)。(點擊一次,我就可以輸入)

1

當您觸摸PopupWindow外部時,OnDismissListener觸發外部窗口觸發,默認情況下,所以你可以在popupWindow上設置OnDismissListener來聽窗外的觸摸。

popup.setOnDismissListener(new PopupWindow.OnDismissListener() { 
    @Override 
    public void onDismiss() { 
     //Do Something here 
    } 
}); 
+0

這應該是接受的答案 – grago 2018-01-14 22:44:45