focus 是使用物理按键的情况描述,例如使用向下键选中一个view,这个view就是focused
* Button 获取焦点:
button.setFocusable(true);
button.setFocusableInTouchMode(true);
button.requestFocus();
button.setFocusableInTouchMode(true);
button.requestFocus();
二、 Android Focus 相关源码分析
焦点改变最终都会调用View.requestFocus()以下是对其源码简单分析
1. 以下情况都不符合focus情况
focusable - false
visibility - false
Touch - false
向上循环所有的ViewGroup - 是否阻拦
2. 处理focus请求
2.1 在当前view下执行mParent下面方法
View - mParent .requestChildFocus (this, this);
ViewGroup - mParent.requestChildFocus( viewGroup, currentView);
向上一级级遍历,所有视图unFocus(清理上一个获取foucs的view执行unFocus)到mParent为空时结束
View - mParent .requestChildFocus (this, this);
ViewGroup - mParent.requestChildFocus( viewGroup, currentView);
向上一级级遍历,所有视图unFocus(清理上一个获取foucs的view执行unFocus)到mParent为空时结束
unFocus() 中调用onFocusChanged
2.2 调用onFocusChanged回调方法
2.3 refreshDrawableState 进行绘制工作,以后再具体分析
三、焦点相关方法:
setFocusable(boolean)
setFlags()
findFocus
forceLayout
focusSearch
ViewParent.focusSearch
hasFocus
hasFocusable
addFocusables
//想设置ViewGroup里各View的焦点顺序特性,可用
//layout.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);根据参数有不同特性
ViewGroup.focusableViewAvailable
onFocusChanged() 判断状态
配置文件中:android:focusable="false"
setFocusableInTouchMode()
requestFocusFromTouch()
setFlags()
findFocus
forceLayout
focusSearch
ViewParent.focusSearch
hasFocus
hasFocusable
addFocusables
//想设置ViewGroup里各View的焦点顺序特性,可用
//layout.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);根据参数有不同特性
ViewGroup.focusableViewAvailable
onFocusChanged() 判断状态
配置文件中:android:focusable="false"
setFocusableInTouchMode()
requestFocusFromTouch()
四、 疑问
1. View.mParent变量应该记录的是当前view的父节点? 什么时候,怎样初始化的?
2. hasAncestorThatBlocksDescendantFocus
vgAncestor.getDescendantFocusability() == ViewGroup.FOCUS_BLOCK_DESCENDANTS
此方法中的这个开关,在什么地方设置的?
3. handleFocusGainInternal
( mPrivateFlags & FOCUSED ) == 0
判断的含义?
4. focus全局应该只有一个吧,清理一个不就行了,为什么还依次向上遍历?
5. view的fouces状态记录在什么地方,如何知道当前有哪一个是focus的???
6. ViewGroup即使设置focus监听也不会执行,除非调用requestFoucs,执行ViewGroup.requestFocus
7. 焦点切换
1. View.mParent变量应该记录的是当前view的父节点? 什么时候,怎样初始化的?
2. hasAncestorThatBlocksDescendantFocus
vgAncestor.getDescendantFocusability() == ViewGroup.FOCUS_BLOCK_DESCENDANTS
此方法中的这个开关,在什么地方设置的?
3. handleFocusGainInternal
( mPrivateFlags & FOCUSED ) == 0
判断的含义?
4. focus全局应该只有一个吧,清理一个不就行了,为什么还依次向上遍历?
5. view的fouces状态记录在什么地方,如何知道当前有哪一个是focus的???
6. ViewGroup即使设置focus监听也不会执行,除非调用requestFoucs,执行ViewGroup.requestFocus
7. 焦点切换
资料:
自己控制焦点的移动
通过配置文件,自己控制前后左右下一个焦点view是哪个