setDescendantFocusability,在父View和子View间处理焦点关系
来源:互联网 发布:知我者芈月也 编辑:程序博客网 时间:2024/06/12 06:23
开发中很常见的一个问题,项目中的listview不仅仅是简单的文字,常常需要自己定义listview,自己的Adapter去继承BaseAdapter,在adapter中按照需求进行编写,问题就出现了,可能会发生点击每一个item的时候没有反应,无法获取的焦点。原因多半是由于在你自己定义的Item中存在诸如ImageButton,Button,CheckBox等子控件(也可以说是Button或者Checkable的子类控件),此时这些子控件会将焦点获取到,所以常常当点击item时变化的是子控件,item本身的点击没有响应。
这时候就可以使用descendantFocusability来解决啦,API描述如下:
android:descendantFocusability
Defines the relationship between the ViewGroup and its descendants when looking for a View to take focus.
Must be one of the following constant values.
该属性是当一个为view获取焦点时,定义viewGroup和其子控件两者之间的关系。
属性的值有三种:
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
*******************************************************************************************************
这个函数是在ViewGroup里定义的,主要用于控制child View获取焦点的能力,比如是否阻止child View获取焦点。
他有三个常量可供设置
- FOCUS_BEFORE_DESCENDANTS ViewGroup本身先对焦点进行处理,如果没有处理则分发给child View进行处理
- FOCUS_AFTER_DESCENDANTS 先分发给Child View进行处理,如果所有的Child View都没有处理,则自己再处理
- FOCUS_BLOCK_DESCENDANTS ViewGroup本身进行处理,不管是否处理成功,都不会分发给ChildView进行处理
- public void setDescendantFocusability(int focusability) {
- switch (focusability) {
- case FOCUS_BEFORE_DESCENDANTS:
- case FOCUS_AFTER_DESCENDANTS:
- case FOCUS_BLOCK_DESCENDANTS:
- break;
- default:
- throw new IllegalArgumentException("must be one of FOCUS_BEFORE_DESCENDANTS, "
- + "FOCUS_AFTER_DESCENDANTS, FOCUS_BLOCK_DESCENDANTS");
- }
- mGroupFlags &= ~FLAG_MASK_FOCUSABILITY;
- mGroupFlags |= (focusability & FLAG_MASK_FOCUSABILITY);
- }
可以看到,只有这三个常量可以设置,不是这三个常量会抛出异常的。
设置后,会在requestFocus(int direction, Rect previouslyFocusedRect) 方法里根据设置进行相应的处理。来看下实现
- public boolean requestFocus(int direction, Rect previouslyFocusedRect) {
- if (DBG) {
- System.out.println(this + " ViewGroup.requestFocus direction="
- + direction);
- }
- int descendantFocusability = getDescendantFocusability();
- switch (descendantFocusability) {
- case FOCUS_BLOCK_DESCENDANTS:
- return super.requestFocus(direction, previouslyFocusedRect);
- case FOCUS_BEFORE_DESCENDANTS: {
- final boolean took = super.requestFocus(direction, previouslyFocusedRect);
- return took ? took : onRequestFocusInDescendants(direction, previouslyFocusedRect);
- }
- case FOCUS_AFTER_DESCENDANTS: {
- final boolean took = onRequestFocusInDescendants(direction, previouslyFocusedRect);
- return took ? took : super.requestFocus(direction, previouslyFocusedRect);
- }
- default:
- throw new IllegalStateException("descendant focusability must be "
- + "one of FOCUS_BEFORE_DESCENDANTS, FOCUS_AFTER_DESCENDANTS, FOCUS_BLOCK_DESCENDANTS "
- + "but is " + descendantFocusability);
- }
- }
通过这里的实现可以看到上面定义的三个常量设置的意思。。
-------------华丽的分割线---------------------------------------
增加xml中的配置方法,一劳永逸
adapter的item根布局添加属性 android:descenadantFocusability="blockDesceadant"
ImageButton / Button/ checkBox中添加android:focusability="false"
可以解决item不相应点击事件问题
- setDescendantFocusability,在父View和子View间处理焦点关系
- setDescendantFocusability,在父View和子View间处理焦点关系
- setDescendantFocusability,在父View和子View间处理焦点关系
- setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS)会让所有子View无法获取焦点
- view嵌套处理滑动,子view传递滑动事件给父view,父view传递滑动事件给子view
- Android中父View和子view的点击事件处理问题探讨
- android父View手势和子View的点击事件处理
- 让ViewGroup中的子View获得焦点
- 让ViewGroup中的子View获得焦点
- viewgroup和子view关系为何暨PinnedExpandableListView总结
- view和activity关系
- view和activity关系
- Android中父View和子view的点击事件
- requestDisallowInterceptTouchEvent解决子View和父View滑动的冲突
- Android中父View和子view的点击事件
- xib子View和父View按比例设置
- Android中父View和子view的点击事件
- android中view的focus焦点处理
- CDH版本 HDFS NFS Gateway 无法启动、挂载失败问题
- 关于Android TouchDelegate源码解析
- [CSS]图片水平排列并且有固定间隔
- ClouderaManager安装hive后执行sql时写hdfs无权限
- String 转 BigDecimal
- setDescendantFocusability,在父View和子View间处理焦点关系
- Android popupwindow 随笔
- 静态链表的学习
- 从头到尾彻底理解KMP
- 如何检查百度统计安装是否成功---js引用版
- python学习001
- 关于耳机的连接
- spring boot 框架下的redis缓存问题
- cd命令详解