Android View大厂面试题(二)
2022-08-14 本文已影响0人
在岁月中远行
LinearLayout里面嵌套了Button,LinearLayout 设置了onClick 事件,但是Button 没有设置点击事件,当我点击Button 的时候,LinearLayout 的onClick 会不会执行?
不会执行
![](https://img.haomeiwen.com/i4471798/da50e90ff9e99333.png)
View(Button)对于ACTION_DOWN事件,只要是clickable的控件,默认都是返回true的。
![](https://img.haomeiwen.com/i4471798/e6fec8523b31af05.png)
在ACTION_UP和ACTION_MOVE的时候,由于LinearLayout没有拦截后续事件,所有后续所有的事件还是被Button消费了。
也就是如果在ACTION_DOWN的时候,父View不拦截事件,子View的onTouchEvent返回了true,接着在ACTION_MOVE的时候,父View还不拦截事件,那么ACTION_UP事件有没有被子View消费,父View也不管了,只管传递,
从源码中也可以看到,就算是Button处理了ACTION_DOWN,如果父View对与后续的ACTION_MOVE没有拦截。那么当ACTION_UP的时候,就算Button自己不处理,那么父View也不会处理。
这里补充一下:
当给Button加上android:clickable="false"时候,或者把button换成imageview,那么点击button或者imageview的时候
就会触发linearlayout的点击事件了。
![](https://img.haomeiwen.com/i4471798/a105080bc730d96b.png)
原因就是 此时的onTouchEvent的ACTION_DOWN返回false,表示子View不处理此事件。