Java 您能否确定在ViewGroup中处理事件时触动了哪个子视图?
考虑一下这个假设的层次结构Java 您能否确定在ViewGroup中处理事件时触动了哪个子视图?,java,android,touch-event,viewgroup,Java,Android,Touch Event,Viewgroup,考虑一下这个假设的层次结构 LinearLayoutA <-- I want to handle the touches here... | +-SomeViewX +-SomeOtherViewY +-LinearLayoutB | +-CustomView1 <-- for these three CustomView objects +-CustomView2 +-CustomView3 LinearLayout
LinearLayoutA <-- I want to handle the touches here...
|
+-SomeViewX
+-SomeOtherViewY
+-LinearLayoutB
|
+-CustomView1 <-- for these three CustomView objects
+-CustomView2
+-CustomView3
LinearLayoutA用于ViewGroup
s的OnTouchListener
在ViewGroup
中作为其视图
参数传递,而不是该视图
中实际被触摸的子对象。由于您无法控制布局中视图
s的源代码,因此必须从外部手动添加OnTouchListener
正如我在评论中提到的,您可以将同一个侦听器附加到要侦听的每个视图上,从而对所有视图
重用该侦听器。如果要动态添加这些视图
s,那么在创建它们时也可以对它们调用setOnTouchListener()
有关此主题的更多信息,请查看为家长截取孩子的触摸事件提供了一种方法,但反之亦然。用于视图组的OnTouchListener
将视图组
作为其视图
参数传递,而不是该视图
中实际被触摸的孩子。由于您无法控制布局中视图
s的源代码,因此必须从外部手动添加OnTouchListener
正如我在评论中提到的,您可以将同一个侦听器附加到要侦听的每个视图上,从而对所有视图
重用该侦听器。如果要动态添加这些视图
s,那么在创建它们时也可以对它们调用setOnTouchListener()
有关主题的更多信息,请查看为父对象提供了一种截获子对象上的触摸事件的方法,但反之亦然。OnTouchListener将视图作为参数,因此您可以对所有3个对象使用同一个侦听器,并通过查看参数知道哪个对象被击中。但是,这仍然需要手动附加单个侦听器。是的,手动附加侦听器是我试图避免的,特别是因为其中一些视图是在我的控制之外和/或动态创建的。那就意味着我是对的。。。使用默认事件路径无法知道tap事件的源视图?因为您无法控制视图,我认为您必须在某个位置附加一个侦听器,但是重用单个OnTouchListener
对象应该可以相对轻松地实现。谢谢。如果你把它写在一个答案里,如果在一天左右没有人能想出更好的答案,我会把你的答案记为被接受的答案。今晚我有更多的时间,我会尝试做更多的研究,然后再把任何东西作为答案发布。确实应该有一种方法来做到这一点,但我所看到的一切都忽略了这个确切的例子。OnTouchListener将视图作为参数,因此您可以对所有3个对象使用同一个侦听器,并通过查看参数来知道哪个对象被击中。但是,这仍然需要手动附加单个侦听器。是的,手动附加侦听器是我试图避免的,特别是因为其中一些视图是在我的控制之外和/或动态创建的。那就意味着我是对的。。。使用默认事件路径无法知道tap事件的源视图?因为您无法控制视图,我认为您必须在某个位置附加一个侦听器,但是重用单个OnTouchListener
对象应该可以相对轻松地实现。谢谢。如果你把它写在一个答案里,如果在一天左右没有人能想出更好的答案,我会把你的答案记为被接受的答案。今晚我有更多的时间,我会尝试做更多的研究,然后再把任何东西作为答案发布。真的应该有办法做到这一点,但到目前为止我所看到的一切都忽略了这个确切的案例。是的,这就是我害怕的。这是行不通的,因为它为直接子女增加了听众,而我想要的可能是(曾孙)。令人遗憾的是,Android没有像在Windows上那样,在活动中弹出触摸视图。同样,这里有发送方(可能是视图组),但也有源,可能是实际接触的视图,不管它在层次结构中的什么位置(如果上面没有人处理它),您不必使用直接父对象来应用侦听器。无论您在何处收到要添加的视图
,请调用setOnTouchListener()
并向其传递一个OnTouchListener
对象。您可以将该对象存储在正在运行的活动中的任何位置,因此视图在层次结构中的位置应该无关紧要。假设我正在加载一个本身包含一个布局的布局,该布局本身包含一个布局。在最深的布局中,假设它使用了称为drumpad的控件。我想知道哪个鼓被点击了。如果我必须向它添加处理程序,那么我必须遍历所有的树,寻找它们要附着的对象,不是吗?这似乎是一个很大的问题。我知道。。。我被宠坏了。我只是习惯于添加一个侦听器来侦听它下面的所有内容。在布局中添加drumpad的地方找到您的addView()
。在该行之前,对每个DrumPad调用setOnTouchListener()
,并将其传递给侦听器。没有必要去爬网,因为听者已经被连接上了。在我的例子中也不是真正的鼓垫。不知道我为什么这么说!哈哈。是的,长话短说,安卓似乎无法告诉我我需要什么,这是一个耻辱,因为系统清楚地知道是谁发起了触摸,因为它已经知道如何将触摸发送给他们。既然你可以拦截,很遗憾他们没有说拦截的是谁。毕竟,这就是他们将你取消的触摸发送给的人,所以这也是众所周知的。只是不向消费者的