`

Android ViewGroup.setDescendantFocusability函数

阅读更多

这个函数是在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);
        }
    }

 

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

 

2
3
分享到:
评论

相关推荐

    android各组件详解- ViewGroup.pdf

    ### Android各组件详解—ViewGroup #### 回顾与引言 在深入探讨`ViewGroup`之前,我们先简要回顾一下之前所学的基础概念。`View`是Android应用程序中最基本的构建单元,用于创建用户界面的各种控件,如按钮、文本框...

    Android中使用自定义ViewGroup的总结

    最后,在CustomLinearLayout类中,我们需要覆盖`generateLayoutParams(AttributeSet attrs)`和`checkLayoutParams(ViewGroup.LayoutParams p)`方法,以确保系统使用我们的自定义LayoutParams: ```java public ...

    android viewgroup view 源码

    在Android开发中,`ViewGroup`和`View`是构建用户界面的核心组件。`View`是所有UI元素的基类,而`ViewGroup`则是一个特殊的`View`,它能够包含多个子`View`,形成了Android UI的层级结构。这份源码提供了深入理解这...

    android.service.java

    params.width = android.view.ViewGroup.LayoutParams.WRAP_CONTENT;// 窗口宽度 params.height = android.view.ViewGroup.LayoutParams.WRAP_CONTENT;// 窗口高度 manager.addView(layout, params); }

    Android LinearLayout.LayoutParams 使用方法

    ViewGroup.LayoutParams.WRAP_CONTENT, // 宽度 ViewGroup.LayoutParams.WRAP_CONTENT); // 高度 ``` 接下来,我们可以修改LayoutParams的属性,例如设置布局权重: ```java layoutParams.weight = 1.0f; //...

    Android用纯代码实现复杂界面.pdf

    scrollView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); ``` 接下来,我们创建一个LinearLayout作为ScrollView的内容容器,并设置...

    Android-可以指定圆角的ViewGroup

    在Android开发中,创建具有指定圆角的ViewGroup是一个常见的需求,这可以帮助开发者设计出更加美观和具有现代感的用户界面。"Android-可以指定圆角的ViewGroup"这个主题聚焦于如何在Android应用中实现自定义的布局,...

    Android_PdfView

    FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); pdfView.setLayoutParams(layoutParams); parentView....

    安卓开发-Android 主流的图片浏览的全屏缩放效果SmoothImageDemo软件源码

    安卓开发-Android 主流的图片浏览的全屏缩放效果SmoothImageDemo软件源码: import java.io.File; import java.util....import android.view.ViewGroup; import android.widget.BaseAdapter; import android.wi

    代码实现控件水平居中

    ViewGroup.LayoutParams.WRAP_CONTENT); layoutParams.gravity = Gravity.CENTER_HORIZONTAL; yourWidget.setLayoutParams(layoutParams); ``` 在Kotlin中,代码会更加简洁: ```kotlin val layoutParams = ...

    android获取根View的方法

    ViewGroup rootView = (ViewGroup) decorView.findViewById(android.R.id.content); ``` 在这个例子中,`android.R.id.content`是默认的根View ID,通常是一个FrameLayout。 五、使用Kotlin的扩展函数 在Kotlin中...

    android 开发 图片滑动

    package wei.ye.g1;import android.app.Activity;...import android.view.ViewGroup.LayoutParams;import android.widget.BaseAdapter;import android.widget.Gallery;import android.widget.ImageView;

    android viewpager android-support-v4.jar

    标题中的“android viewpager android-support-v4.jar”指的是Android平台上的一个关键组件——ViewPager,以及它依赖的Android Support Library v4。ViewPager是Android SDK中用于实现页面滑动效果的控件,常见于...

    android 全屏幕以按钮覆盖----动态产生按钮并最大化

    && bigButton.getLayoutParams().height == ViewGroup.LayoutParams.MATCH_PARENT) { // 恢复原状 layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT; layoutParams.height = ViewGroup.LayoutParams....

    Android MyView.zip

    首先,`MyView`是自定义的View类,它通常继承自Android的基础View类,如`View`或`ViewGroup`。在这个案例中,`MyView`可能扩展了`View`类,以便从头开始构建一个基础视图。开发者可以通过重写`onDraw()`方法来绘制...

    Android 自定义ViewGroup 实战篇 -> 实现FlowLayout源码程序

    在Android开发中,自定义ViewGroup是实现复杂布局和交互的关键技术之一。本实战篇将聚焦于如何实现一个名为FlowLayout的自定义布局,它允许子视图按行排列,类似于HTML中的`<div>`标签。在Android应用设计中,...

    从源码解析Android中View的容器ViewGroup

    这回我们是深入到ViewGroup内部\,了解ViewGroup的工作...在这个类里定义了ViewGroup.LayoutParams类,这个类是布局参数的子类。  其实ViewGroup也就是View的容器。通过ViewGroup.LayoutParams来指定子View的参数。 V

    android.jar源码

    3. **View**: 视图系统是Android UI构建的基础,包括View和ViewGroup。源码解释了布局绘制、触摸事件处理以及动画实现的细节。 4. **BroadcastReceiver**: 广播接收器用于监听系统或应用发出的广播事件。源码中可以...

    Android 绝对布局的使用

    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> android:id="@+id/button1" android:layout_width="wrap_...

Global site tag (gtag.js) - Google Analytics