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