如何通知PopupWindow触及的外部事件?

该文档指出,当setOutsideTouchable(boolean touchable)设置为true时, PopupWindowsetOutsideTouchable(boolean touchable)窗口之外的触摸事件。 popupwindow如何通知? 我没有看到任何像setOnOutsideTouchListener等的监听setOnOutsideTouchListener来接收该信息。

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

谢谢。

尝试使用setTouchInterceptor,如下面的代码片段

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

也不要忘记设置以下标志:

 popup.setOutsideTouchable(true); 

当您在PopupWindow外部触摸时,触发OnDismissListener是因为触摸外部窗口默认情况下会关闭窗口,因此您可以在popupWindow上设置OnDismissListener以侦听窗口外的触摸。

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

“popup窗口是一个浮动容器,显示在当前活动的顶部。”

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

我想这就是你要找的东西。

PopupWindow以与所有其他触摸事件相同的方式通知外部触摸事件。 当在事件路由到popup窗口之外设置标志时,您可以像处理触摸一样处理它们。 没有特殊方法可以测试此外部事件或为此类事件设置侦听器。 如果你检查源代码:

 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。

补充:在我的情况下,如果我单击popupWindow外的EditText,如果setFocusable(true),event.getAction()== 0(所以我必须双击editText才能输入。)如果setFocusable(false,event.getAction) ()== 4(MotionEvent.ACTION_OUTSIDE)。(点击一次,我可以输入)