[Android踩坑]LinearLayout与ImageView的点击事件冲突

在最近的项目中用到了LinearLayout中嵌套一个ImageView的布局,但是点击事件设置在LinearLayout中却无响应,综合网上的教程总结一下几种可能导致的情况:

 

1.如果在ImageView中和LinearLayout同时设置点击事件,会发现触发的是ImageView的点击事件,说明点击事件被子控件ImageView消耗了。这涉及到事件分发的机制,简述下解决方案:

在XML布局文件中的LinearLayout项设置android:clickable="true",ImageView设置android:clickable="false"。

采用这种方案的话最好将LinearLayout下所有子控件的都设置为不可点击。属于比较麻烦的方法。

 

2.既然提到了事件分发,就说一个酷炫一点的解决方法:

通过继承LinearLayout,重写onInterceptTouchEvent方法实现拦截,该方法从父view传向子view,意思为是否中断事件的传递。返回值用false表示不拦截事件,接着就在重写的onInterceptTouchEvent中进行操作。此时只要点击LinearLayout,都会先优先调用这个方法,也就是在事件被传递到子控件前调用,从而实现拦截。

 

3.搜索资料得知还有第三种常见解决方案:

当点击事件发生时子控件会获得焦点,此时可以通过descendantFocusability属性来控制viewGroup与子控件之间的关系。该属性的值有三种:

beforeDescendants:viewgroup会优先其子类控件而获取到焦点

afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点

blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点

因此在上述项目中只需要在LinearLayout中设置android:descendantFocusability= "blocksDescendants"即可以屏蔽子控件获得焦点。这个方法对于重写了onInterceptTouchEvent与onTouchEvent的控件会不起作用。

你可能感兴趣的:(踩坑记录)