ViewGroup 和 ChildView 同时注册事件监听器,哪个先执行?
ViewGroup 和 ChildView 同时注册了事件监听器(onClick等),哪个会执行? 事件优先给 ChildView,会被 ChildView消费掉,ViewGroup 不会响应。
这个好像不符合事件传递机制
如果上层View没有默认拦截事件,则事件会首先传递给下层View的,先询问下层View是否需要消费事件。
注册了监听器,只是说明ViewGroup具备事件消费能力,但没有明确表示要拦截事件,所以还是会先询问ChildView,在询问ChildView的时候事件会被最下层的ChildView消费掉,所以ViewGroup不会响应。
既然是viewgroup先拿到事件的为什么没有响应呢? 难道事件实在回传的时候才响应的吗?
看原理篇函数调用流程,有图。

如果ViewGroup不拦截,那么只有ChildView不消费,ViewGroup才会响应。
明白了,我的理解是这段代码谢谢
public boolean dispatchTouchEvent(MotionEvent ev) {
boolean result = false; // 默认状态为没有消费过
if (!onInterceptTouchEvent(ev)) { // 如果没有拦截交给子View
result = child.dispatchTouchEvent(ev);
}
if (!result) { // 如果事件没有被消费,询问自身onTouchEvent
result = onTouchEvent(ev);
}
return result;
}
嗯,是的。
child 会消费掉前提是父控件没有拦截吧????
LinearLayout 包含textview,同时注册点击事件,点击textview,LinearLayout的点击事件不打印日志。点击LinearLayout,textview的点击事件不打印日志。
ViewGroup 和 ChildView 同时注册了事件监听器(onClick等),哪个会执行?
事件优先给 ChildView,会被 ChildView消费掉,ViewGroup 不会响应
这个结论是不是应该加上在同一事件中吧,比如是点击textview是一次传动事件的过程,点击LinearLayout是另外一次事件的传递,是不是这样理解?我阅读的时候引起了歧义😭
你好好把事件分发这块看一下吧!无论是点击textView还是LinearLayout事件都i是先分发到LinearLayout,事件的传递:Activity----->ViewGroup------>子View。在你说的这种情况下,点击TextView,事件传递到LinearLayout的时候,发现点击区域在TextView,就把事件传递给TextView了,自身不响应事件。点击LinearLayout,事件传递到LinearLayout,经过判断发现就是应该自己处理,就会把事件交给自己的onClickListener。这只是简略的表述,要想弄明白,你还是去看看事件分发的过程,网上资料很多。
------------------ 原始邮件 ------------------ 发件人: "notifications"<[email protected]>; 发送时间: 2019年11月25日(星期一) 晚上7:42 收件人: "GcsSloop/AndroidNote"<[email protected]>; 抄送: "Subscribed"<[email protected]>; 主题: Re: [GcsSloop/AndroidNote] ViewGroup 和 ChildView 同时注册事件监听器,哪个先执行? (#55)
LinearLayout 包含textview,同时注册点击事件,点击textview,LinearLayout的点击事件不打印日志。点击LinearLayout,textview的点击事件不打印日志。
ViewGroup 和 ChildView 同时注册了事件监听器(onClick等),哪个会执行? 事件优先给 ChildView,会被 ChildView消费掉,ViewGroup 不会响应
这个结论是不是应该加上在同一事件中吧,比如是点击textview是一次传动事件的过程,点击LinearLayout是另外一次事件的传递,是不是这样理解?我阅读的时候引起了歧义😭
— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub, or unsubscribe.