首页   

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

ONE+1.  ·  · 3 年前

本文主要描述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 会覆盖子类控件而直接获得焦点
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

在这里插入图片描述

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

在这里插入图片描述

android:descendantFocusability=“blocksDescendants”:

focusable 属性 item 可点击性 子控件可点击性
false true true
true true true

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

android:descendantFocusability=“afterDescendants”:

focusable 属性 item 可点击性 子控件可点击性
false true true
true false true

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

android:descendantFocusability=“beforeDescendants”:

focusable 属性 item 可点击性 子控件可点击性
false true true
true false true

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

推荐文章
生信宝典  ·  浙江大学良渚实验室沈宁团队Genome ...  ·  4 月前  
中国化学品安全协会  ·  【揪出身边的隐患】别拿符合性评价不当回事  ·  1 年前  
潮音乐  ·  晚安曲 | 今夜请收听...  ·  4 年前  
© 2022 51好读
删除内容请联系邮箱 2879853325@qq.com