Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 您能否确定在ViewGroup中处理事件时触动了哪个子视图?_Java_Android_Touch Event_Viewgroup - Fatal编程技术网

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()
,并将其传递给侦听器。没有必要去爬网,因为听者已经被连接上了。在我的例子中也不是真正的鼓垫。不知道我为什么这么说!哈哈。是的,长话短说,安卓似乎无法告诉我我需要什么,这是一个耻辱,因为系统清楚地知道是谁发起了触摸,因为它已经知道如何将触摸发送给他们。既然你可以拦截,很遗憾他们没有说拦截的是谁。毕竟,这就是他们将你取消的触摸发送给的人,所以这也是众所周知的。只是不向消费者的