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.     }  

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以通过自定义样式来修改 Android DatePicker 控件的外观。以下是一个示例: 1. 首先,在你的 layout 文件中,添加一个 DatePicker 控件: ```xml <DatePicker android:id="@+id/datePicker" android:layout_width="wrap_content" android:layout_height="wrap_content" /> ``` 2. 然后,在你的 styles.xml 文件中,定义一个样式: ```xml <style name="MyDatePickerStyle" parent="@android:style/Widget.DatePicker"> <item name="android:calendarTextColor">#FFFFFF</item> <item name="android:headerBackground">#000000</item> <item name="android:headerDayOfMonthTextAppearance">@style/MyDatePickerTextAppearance</item> <item name="android:headerMonthTextAppearance">@style/MyDatePickerTextAppearance</item> <item name="android:headerYearTextAppearance">@style/MyDatePickerTextAppearance</item> <item name="android:yearListItemTextAppearance">@style/MyDatePickerTextAppearance</item> <item name="android:yearListSelectorColor">#FF0000</item> </style> <style name="MyDatePickerTextAppearance"> <item name="android:textColor">#FFFFFF</item> <item name="android:textSize">20sp</item> </style> ``` 3. 最后,在你的代码中,使用这个样式: ```java DatePicker datePicker = (DatePicker) findViewById(R.id.datePicker); datePicker.setCalendarViewShown(false); datePicker.setSpinnersShown(true); datePicker.setDescendantFocusability(DatePicker.FOCUS_BLOCK_DESCENDANTS); datePicker.setMaxDate(new Date().getTime()); datePicker.setMinDate(minDate.getTime()); datePicker.init(year, month, day, new OnDateChangedListener() { @Override public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { // 处理日期变化事件 } }); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { datePicker.setFirstDayOfWeek(Calendar.MONDAY); datePicker.setElevation(4f); datePicker.setTranslationZ(2f); datePicker.setBackgroundColor(Color.BLACK); datePicker.setForegroundGravity(Gravity.CENTER); datePicker.setGravity(Gravity.CENTER); datePicker.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); datePicker.setCalendarViewShown(false); datePicker.setSpinnersShown(true); datePicker.setDescendantFocusability(DatePicker.FOCUS_BLOCK_DESCENDANTS); datePicker.setMaxDate(new Date().getTime()); datePicker.setMinDate(minDate.getTime()); datePicker.setSpinnersShown(true); datePicker.setMinHeight(200); datePicker.setMaxHeight(500); datePicker.setMinWidth(200); datePicker.setMaxWidth(500); datePicker.setSaveEnabled(true); datePicker.setStyle(R.style.MyDatePickerStyle); // 设置样式 } ``` 注意:以上代码仅供参考,具体样式和代码实现可能需要根据你的需求进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值