我有一个由多个线性布局形成的自定义日历布局。当我将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()方法。

10-08 16:41