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

时间:2014-10-19 23:36:54

标签: android

该文档指出PopupWindow将在其窗口之外通知触摸事件 setOutsideTouchable(boolean touchable)设置为true。 popupwindow如何通知?我没有看到像setOnOutsideTouchListener等听众那样收到这些信息。

实施例

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

感谢。

5 个答案:

答案 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)。(点击一次,我可以输入)