2011-04-20 53 views
2

我有一个自定义View,它包含一个按钮和一个视图,该视图在包含多项选择项的自定义视图的按钮下面进行动画处理。当用户按下按钮时,我会显示项目的“下拉列表”。我想在下拉菜单之外按下时隐藏“下拉菜单”。我试图覆盖onTouchEventonInterceptTouchEvent,但这些并不总是被称为。Android:如何关闭用户按下视图时的自定义视图

我看了一下Spinner的源代码,并注意到谷歌正在使用一个对话框来实现我认为是它的下拉菜单(它在这一点上的定位超出了我的意思)。

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

回答

4

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

然后,确定您的自定义视图的位置:如果触摸位置(使用event.getX()event.getY()方法)是视野之外(使用myView.getTop()等),那么就可以将其隐藏(myView.setVisibility(View.GONE)。

无论如何,它应该return false允许儿童View s来处理触摸。

从Android开发者指南:

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

注:Android将首先调用事件处理程序,然后再从类定义中调用合适的默认处理程序。因此,从这些事件侦听器返回true将停止事件传播给其他事件侦听器,并且还会阻止视图中默认事件处理程序的回调。所以当你返回true时,要确定你想终止事件。

0

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

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

相关问题