【问题标题】:Android: How to close custom view when user presses outside the viewAndroid:当用户在视图外按下时如何关闭自定义视图
【发布时间】:2011-04-21 08:54:37
【问题描述】:

我有一个自定义View,它由一个按钮和一个在按钮下方进行动画处理的视图组成,其中包含多选项目的自定义视图。当用户按下按钮时,我会显示带有项目的“下拉菜单”。当他们按下下拉菜单时,我想隐藏“下拉菜单”。我尝试覆盖onTouchEvent 和onInterceptTouchEvent,但这些并不总是被调用。

我查看了Spinner 的源代码,并注意到 Google 正在使用一个对话框作为我认为的下拉菜单(此时它的定位方式超出了我的范围)。

有什么方法可以让我的View 拦截Window 上的所有触摸事件?

【问题讨论】:

    标签: android view drop-down-menu spinner


    【解决方案1】:

    您可以在顶部的ViewGroup 上实现onTouchListener(例如,在LinearLayout 或您正在使用的任何东西上)。

    然后,确定你的自定义视图的位置:如果触摸位置(使用event.getX()和event.getY()方法)在视图之外(使用myView.getTop()等),那么它可以隐藏它(@987654327 @)。

    无论如何,应该return false让孩子Views来处理触摸。

    来自 android 开发指南:

    请记住,关键事件总是传递给当前焦点所在的视图。它们从 View 层次结构的顶部开始调度,然后向下调度,直到它们到达适当的目的地。

    注意:Android 将首先调用事件处理程序,然后调用类定义中相应的默认处理程序。因此,从这些事件侦听器返回 true 将停止将事件传播到其他事件侦听器,并且还会阻止对 View 中默认事件处理程序的回调。所以一定要在返回 true 时终止事件。

    【讨论】:

      【解决方案2】:

      我不知道它是如何工作的,但乍一看TouchDelegate 可能是一个解决方案。此外,Activity.onTouchEvent() 可能值得一试。

      如果它们不适用(即您不知道如何使用 TouchDelegate 并且您的布局中有按钮可以在“下拉”视图之外执行触摸),您可以考虑使用 intercepting the event仍然在“上升”视图。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-03
        相关资源
        最近更新 更多