[Android踩坑]LinearLayout与TextView
在最近的项目中用到了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的控件会不起作用。