这个函数是在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);
}
}
通过这里的实现可以看到上面定义的三个常量设置的意思。。
分享到:
相关推荐
### Android各组件详解—ViewGroup #### 回顾与引言 在深入探讨`ViewGroup`之前,我们先简要回顾一下之前所学的基础概念。`View`是Android应用程序中最基本的构建单元,用于创建用户界面的各种控件,如按钮、文本框...
最后,在CustomLinearLayout类中,我们需要覆盖`generateLayoutParams(AttributeSet attrs)`和`checkLayoutParams(ViewGroup.LayoutParams p)`方法,以确保系统使用我们的自定义LayoutParams: ```java public ...
在Android开发中,`ViewGroup`和`View`是构建用户界面的核心组件。`View`是所有UI元素的基类,而`ViewGroup`则是一个特殊的`View`,它能够包含多个子`View`,形成了Android UI的层级结构。这份源码提供了深入理解这...
params.width = android.view.ViewGroup.LayoutParams.WRAP_CONTENT;// 窗口宽度 params.height = android.view.ViewGroup.LayoutParams.WRAP_CONTENT;// 窗口高度 manager.addView(layout, params); }
ViewGroup.LayoutParams.WRAP_CONTENT, // 宽度 ViewGroup.LayoutParams.WRAP_CONTENT); // 高度 ``` 接下来,我们可以修改LayoutParams的属性,例如设置布局权重: ```java layoutParams.weight = 1.0f; //...
scrollView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); ``` 接下来,我们创建一个LinearLayout作为ScrollView的内容容器,并设置...
在Android开发中,创建具有指定圆角的ViewGroup是一个常见的需求,这可以帮助开发者设计出更加美观和具有现代感的用户界面。"Android-可以指定圆角的ViewGroup"这个主题聚焦于如何在Android应用中实现自定义的布局,...
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); pdfView.setLayoutParams(layoutParams); parentView....
安卓开发-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 = ...
ViewGroup rootView = (ViewGroup) decorView.findViewById(android.R.id.content); ``` 在这个例子中,`android.R.id.content`是默认的根View ID,通常是一个FrameLayout。 五、使用Kotlin的扩展函数 在Kotlin中...
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 Library v4。ViewPager是Android SDK中用于实现页面滑动效果的控件,常见于...
&& bigButton.getLayoutParams().height == ViewGroup.LayoutParams.MATCH_PARENT) { // 恢复原状 layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT; layoutParams.height = ViewGroup.LayoutParams....
首先,`MyView`是自定义的View类,它通常继承自Android的基础View类,如`View`或`ViewGroup`。在这个案例中,`MyView`可能扩展了`View`类,以便从头开始构建一个基础视图。开发者可以通过重写`onDraw()`方法来绘制...
在Android开发中,自定义ViewGroup是实现复杂布局和交互的关键技术之一。本实战篇将聚焦于如何实现一个名为FlowLayout的自定义布局,它允许子视图按行排列,类似于HTML中的`<div>`标签。在Android应用设计中,...
这回我们是深入到ViewGroup内部\,了解ViewGroup的工作...在这个类里定义了ViewGroup.LayoutParams类,这个类是布局参数的子类。 其实ViewGroup也就是View的容器。通过ViewGroup.LayoutParams来指定子View的参数。 V
3. **View**: 视图系统是Android UI构建的基础,包括View和ViewGroup。源码解释了布局绘制、触摸事件处理以及动画实现的细节。 4. **BroadcastReceiver**: 广播接收器用于监听系统或应用发出的广播事件。源码中可以...
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_...