该文档指出PopupWindow
将在其窗口之外通知触摸事件
setOutsideTouchable(boolean touchable)
设置为true。
popupwindow如何通知?我没有看到像setOnOutsideTouchListener
等听众那样收到这些信息。
实施例
PopupWindow popup = new PopupWindow();
popup.setOutsideTouchable(true);
//now what..how to receive those touch outside events?
感谢。
答案 0 :(得分:12)
尝试使用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);
答案 1 :(得分:2)
当您在PopupWindow外部触摸时,OnDismissListener会被触发,因为触摸外部窗口默认情况下会关闭窗口,因此您可以在popupWindow上设置OnDismissListener来监听窗口外的触摸。
popup.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
//Do Something here
}
});
答案 2 :(得分:0)
"弹出窗口是一个浮动容器,显示在 当前的活动。"
See: https://developer.android.com/reference/android/widget/PopupWindow.html
我认为这就是你要找的东西。
答案 3 :(得分: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。
答案 4 :(得分:0)
补充: 在我的情况下,如果我单击popupWindow外的EditText, 如果setFocusable(true),则event.getAction()== 0(所以我必须双击editText才能输入。) 如果setFocusable(false,event.getAction()== 4(MotionEvent.ACTION_OUTSIDE)。(点击一次,我可以输入)