Android studio 中Listview 和 GrideView的item与Button、Checkbox等item的子类控件焦点抢夺问题

本文主要描述Listview 和 GrideView的焦点抢夺问题,内容为自己的学习理解,意在帮助安卓初学者深入理解两者的焦点问题,如有不当欢迎评论区指出我的错误。

主要学习了下面三篇博客

链接: Android ListView Item与子控件焦点问题.
链接: Android之ListView的item获取不到焦点问题.
链接: Android–焦点问题-ListView中item及其子控件无法响应点击事件.

问题描述

在我们使用listview或者grideview时,当item中有存在button或者checkbox这类控件时,会发现无法使用listview中的每个item无法响应点击事件(grideview同理,以下不再赘述)。

原因解释

问题出在listview item的父容器布局中 android:descendantFocusability属性和子控件 android:focus属性的冲突,当listview存在子控件时,子控件获取焦点的优先级是高于父控件的,此时这些子控件会将焦点获取到,所以常常当点击item时变化的是子控件,item本身的点击没有响应。存在Button、ImageButton、CheckBox(一般是是Button或者CheckBox及其子类控件)等获取焦点能力比较强的控件把item的焦点给霸占了,导致item无法获取焦点来动态分配给其他控件,从而无法触发点击事件。

属性测试

android:descendantFocusability属性共有三个取值,分别为

beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup 只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup 会覆盖子类控件而直接获得焦点

在这里插入图片描述

item中的Button的android:focusable可以设为true或false

在这里插入图片描述

android:descendantFocusability=“blocksDescendants”:

focusable 属性item 可点击性子控件可点击性
falsetruetrue
truetruetrue

viewgroup 会覆盖子类控件而直接获得焦点,所以无论子类控件的focusable 属性是什么,都无法霸占焦点,都不影响item的可点击性

android:descendantFocusability=“afterDescendants”:

focusable 属性item 可点击性子控件可点击性
falsetruetrue
truefalsetrue

viewgroup 只有当其子类控件不需要获取焦点时才获取焦点,只有当子类控件的focusable 属性为false时,即子类控件没有能力获取焦点,item才有能力获取焦点,当子类控件的focusable 属性为true时,子类控件是可以获取焦点的,会一直霸占焦点,item就无法得到焦点,自然也无法响应点击事件了

android:descendantFocusability=“beforeDescendants”:

focusable 属性item 可点击性子控件可点击性
falsetruetrue
truefalsetrue

(以下内容为自行理解,不确定正确性,如有不当欢迎评论区或者指出!万分感谢!初学者也应该多看一些其他博客多学习理解!)
viewgroup 会覆盖子类控件而直接获得焦点,当子类控件没有能力获取焦点时,item会取得焦点,也就可以点击,当子类控件有能力获取焦点时,虽然item可以有能力优先获取焦点,由于子类控件的获取焦点的优先级更高,子类控件会抢走焦点,也就使得item失去焦点,无法响应点击事件

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值