我有一个自定义日历布局,该布局由多个线性布局组成。当我将OnTouchListener设置为父视图时。它不起作用,因为它们充满了子视图。而且我无法将侦听器添加到每个子视图中,因为要进行很多设置。有什么解决方案可以解决这个问题?
答案 0 :(得分:1)
事实证明,拦截触摸事件并不像guide那样让我们相信。为了正确处理ViewGroup
中的触摸事件,您需要同时覆盖onInterceptTouchEvent()
和onTouchEvent()
(如果您不希望子视图也获得触摸事件)。
onInterceptTouchEvent()
的{{3}}的解释比指南中的解释更简洁。这是一个reference docs,其中包含相关代码以及说明。
TL; DR -在onInterceptTouchEvent()
中拦截触摸事件并返回true后,以下触摸事件将发送到父视图组的onTouchEvent()
。如果您在onInterceptTouchEvent()
中返回false,则会将以下触摸事件发送到子视图的onTouchEvent()
,您可以在onInterceptTouchEvent()
继续截取它们。
您需要在自定义日历布局中覆盖onInterceptTouchEvent()
并在此处进行触摸处理。请参阅article以获取更多参考。
只要在
onInterceptTouchEvent()
的表面(包括其子表面)上检测到触摸事件,就会调用ViewGroup
方法。如果onInterceptTouchEvent()
返回true,则会拦截MotionEvent
,这意味着它不会传递给子级,而是传递给父级的onTouchEvent()
方法。