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);
        }
    }

 

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

 

Android中,如果你想要设置DatePicker控件(`DatePickerDialog`)的字体大小,这个操作需要通过自定义视图(custom view)来完成,因为原生的DatePicker组件并不直接支持单独调整字体大小。以下是一个简单的步骤: 1. 首先,创建一个自定义的`NumberPicker`子类,覆盖默认样式,并添加对字体大小的支持。例如: ```java public class CustomNumberPicker extends NumberPicker { public CustomNumberPicker(Context context) { super(context); init(); } public CustomNumberPicker(Context context, AttributeSet attrs) { super(context, attrs); init(); } public CustomNumberPicker(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { // 获取当前主题的字体大小 float fontScale = Resources.getSystem().getFontScale(); setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); // 设置数字选择框的字体大小 setTickMarkDrawable(ContextCompat.getDrawable(getContext(), R.drawable.custom_tick_mark)); setMinWidth(0); setMaxHeight(0); // 自适应高度 setSelectionLabelSize((int) (Math.ceil(getTextSize() * fontScale))); } } ``` 2. 在自定义布局文件中,替换原有的`NumberPicker`为你的`CustomNumberPicker`。 3. 然后,在创建`DatePickerDialog`时,传入包含自定义`NumberPicker`的布局作为内容: ```java LayoutInflater inflater = LayoutInflater.from(parentContext); View datePickerView = inflater.inflate(R.layout.your_date_picker_layout, null); // 创建并配置DatePickerDialog new DatePickerDialog(parentContext, yourCallback, year, month, dayOfMonth) { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(datePickerView); } }.show(); ``` 其中,`your_callback`是你处理日期选择的回调函数,`year`, `month`, 和 `dayOfMonth` 是初始选择的日期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值