[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的控件会不起作用。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值