阅读更多

这个函数是在ViewGroup里定义的,主要用于控制child View获取焦点的能力,比如是否阻止child View获取焦点。

 

他有三个常量可供设置

 

  1. FOCUS_BEFORE_DESCENDANTS ViewGroup本身先对焦点进行处理,如果没有处理则分发给child View进行处理
  2. FOCUS_AFTER_DESCENDANTS 先分发给Child View进行处理,如果所有的Child View都没有处理,则自己再处理
  3. 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);        }    }

 

通过这里的实现可以看到上面定义的三个常量设置的意思。。

 

更多相关文章

  1. Android(安卓)ListView中 每一项都有不同的布局
  2. android百度地图开发总结
  3. Android使用Canvas绘制圆形进度条效果
  4. Android(安卓)Jetpack Compose 最全上手指南 | 开发者说·DTalk
  5. Android、java环境搭建流程
  6. unity3d深入学习笔记6:发布Android(安卓)apk
  7. fiddle android
  8. ubuntu android-studio创建右侧快捷启动方式
  9. 使用PreferenceActivity设置应用程序参数

随机推荐

  1. HTML基础:HTML的图片、链接、列表、表格标
  2. 图片列表导航(附table课程表表格)
  3. markdown基础写法
  4. 简单制作课程表
  5. 使用HTML标签制作简单的导航和课程表
  6. 0704作业提交
  7. HTML常用标签属性以及应用场景/怎么用表
  8. html表格制作简单的时间安排表
  9. HTML课堂笔记-0704
  10. Android(安卓)NDK开发之旅36--FFmpeg音视