AndroidNote icon indicating copy to clipboard operation
AndroidNote copied to clipboard

ViewGroup 和 ChildView 同时注册事件监听器,哪个先执行?

Open xinlezhao opened this issue 9 years ago • 8 comments

ViewGroup 和 ChildView 同时注册了事件监听器(onClick等),哪个会执行? 事件优先给 ChildView,会被 ChildView消费掉,ViewGroup 不会响应。

这个好像不符合事件传递机制

xinlezhao avatar Nov 15 '16 04:11 xinlezhao

如果上层View没有默认拦截事件,则事件会首先传递给下层View的,先询问下层View是否需要消费事件。

注册了监听器,只是说明ViewGroup具备事件消费能力,但没有明确表示要拦截事件,所以还是会先询问ChildView,在询问ChildView的时候事件会被最下层的ChildView消费掉,所以ViewGroup不会响应。

GcsSloop avatar Nov 15 '16 04:11 GcsSloop

既然是viewgroup先拿到事件的为什么没有响应呢?  难道事件实在回传的时候才响应的吗?

xinlezhao avatar Nov 15 '16 05:11 xinlezhao

看原理篇函数调用流程,有图。

如果ViewGroup不拦截,那么只有ChildView不消费,ViewGroup才会响应。

GcsSloop avatar Nov 15 '16 05:11 GcsSloop

明白了,我的理解是这段代码谢谢

public boolean dispatchTouchEvent(MotionEvent ev) {
    boolean result = false;             // 默认状态为没有消费过

    if (!onInterceptTouchEvent(ev)) {   // 如果没有拦截交给子View
        result = child.dispatchTouchEvent(ev);
    }

    if (!result) {                      // 如果事件没有被消费,询问自身onTouchEvent
        result = onTouchEvent(ev);
    }

    return result;
}

xinlezhao avatar Nov 15 '16 06:11 xinlezhao

嗯,是的。

GcsSloop avatar Nov 15 '16 06:11 GcsSloop

child 会消费掉前提是父控件没有拦截吧????

zhangyunpenggithub avatar Jul 12 '17 15:07 zhangyunpenggithub

LinearLayout 包含textview,同时注册点击事件,点击textview,LinearLayout的点击事件不打印日志。点击LinearLayout,textview的点击事件不打印日志。

ViewGroup 和 ChildView 同时注册了事件监听器(onClick等),哪个会执行?
事件优先给 ChildView,会被 ChildView消费掉,ViewGroup 不会响应

这个结论是不是应该加上在同一事件中吧,比如是点击textview是一次传动事件的过程,点击LinearLayout是另外一次事件的传递,是不是这样理解?我阅读的时候引起了歧义😭

jingjc avatar Nov 25 '19 11:11 jingjc

你好好把事件分发这块看一下吧!无论是点击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.

wangsanpiao avatar Nov 26 '19 01:11 wangsanpiao