`
liuguofeng
  • 浏览: 449442 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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进行处理
 
我们看下这个方法的实现
Setdescendantfocusability(int focusability)代码  收藏代码
  1. public void setDescendantFocusability(int focusability) {  
  2.         switch (focusability) {  
  3.             case FOCUS_BEFORE_DESCENDANTS:  
  4.             case FOCUS_AFTER_DESCENDANTS:  
  5.             case FOCUS_BLOCK_DESCENDANTS:  
  6.                 break;  
  7.             default:  
  8.                 throw new IllegalArgumentException("must be one of FOCUS_BEFORE_DESCENDANTS, "  
  9.                         + "FOCUS_AFTER_DESCENDANTS, FOCUS_BLOCK_DESCENDANTS");  
  10.         }  
  11.         mGroupFlags &= ~FLAG_MASK_FOCUSABILITY;  
  12.         mGroupFlags |= (focusability & FLAG_MASK_FOCUSABILITY);  
  13.     }  
 

 

可以看到,只有这三个常量可以设置,不是这三个常量会抛出异常的。

 

 

设置后,会在requestFocus(int direction, Rect previouslyFocusedRect) 方法里根据设置进行相应的处理。来看下实现

 

Requestfocus(int direction, rect previouslyfocusedrect)代码  收藏代码
  1. public boolean requestFocus(int direction, Rect previouslyFocusedRect) {  
  2.         if (DBG) {  
  3.             System.out.println(this + " ViewGroup.requestFocus direction="  
  4.                     + direction);  
  5.         }  
  6.         int descendantFocusability = getDescendantFocusability();  
  7.   
  8.         switch (descendantFocusability) {  
  9.             case FOCUS_BLOCK_DESCENDANTS:  
  10.                 return super.requestFocus(direction, previouslyFocusedRect);  
  11.             case FOCUS_BEFORE_DESCENDANTS: {  
  12.                 final boolean took = super.requestFocus(direction, previouslyFocusedRect);  
  13.                 return took ? took : onRequestFocusInDescendants(direction, previouslyFocusedRect);  
  14.             }  
  15.             case FOCUS_AFTER_DESCENDANTS: {  
  16.                 final boolean took = onRequestFocusInDescendants(direction, previouslyFocusedRect);  
  17.                 return took ? took : super.requestFocus(direction, previouslyFocusedRect);  
  18.             }  
  19.             default:  
  20.                 throw new IllegalStateException("descendant focusability must be "  
  21.                         + "one of FOCUS_BEFORE_DESCENDANTS, FOCUS_AFTER_DESCENDANTS, FOCUS_BLOCK_DESCENDANTS "  
  22.                         + "but is " + descendantFocusability);  
  23.         }  
  24.     }  

 

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

分享到:
评论

相关推荐

    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 主流的图片浏览的全屏缩放效果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_PdfView

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

    android获取根View的方法

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

    android之悬浮窗实现_android源码.zip

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:background=...

    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**: 广播接收器用于监听系统或应用发出的广播事件。源码中可以...

Global site tag (gtag.js) - Google Analytics