考虑这个假设的等级......
LinearLayoutA <-- I want to handle the touches here...
|
+-SomeViewX
+-SomeOtherViewY
+-LinearLayoutB
|
+-CustomView1 <-- for these three CustomView objects
+-CustomView2
+-CustomView3
我想要知道的是哪个(大)子视图被触及并在LinearLayoutA中处理它。此外,我不控制这些视图,所以我不能简单地让他们在内部处理触摸并委托给他们的父母。
目前我手动将触摸侦听器添加到CustomViews 1-3,但这需要大量的“样板”工作,这也意味着如果有人点击SomeViewX或SomeOtherViewY,我将不会得到通知,只有我特定的那些将听众附加到。
现在使用其他语言,例如带有WPF的C#,如果你处理相当于LinearLayoutA的事件,事件有效负载的一部分是一个源,这是启动触摸的视图,但我不知道任何在Android中这样的事情。
我看到的所有例子都需要循环遍历孩子并对其进行测试,然后如果存在重叠则通过z顺序消除歧义,并且当您确定了一个孩子时,那么您必须经历其子女并重复。
那么,是否存在内置或“Androidy”方式来了解ViewGroup中哪个子节点被触摸而无需手动迭代和命中测试,或手动将侦听器附加到其所有子节点?
答案 0 :(得分:0)
OnTouchListener
的{{1}}在ViewGroup
中作为ViewGroup
参数传递,而不是View
中实际触及的孩子。由于您无法控制布局中View
的来源,因此您必须从其外部手动添加View
。
正如我的评论中所提到的,您可以通过将其附加到您想要监听的每个OnTouchListener
来为所有View
重用相同的侦听器。如果您动态添加这些View
,那么在创建它们时也可以轻松调用View
。
有关该主题的更多信息,请查看Android's guide to managing touch events in a ViewGroup
,它为父母提供了拦截儿童触摸事件的方法,但反之亦然。