天天记录 - Android焦点相关知识学习

来源:互联网 发布:软件测试校园招聘 编辑:程序博客网 时间:2024/05/22 12:15
     focus 是使用物理按键的情况描述,例如使用向下键选中一个view,这个view就是focused

* Button 获取焦点:
button.setFocusable(true);
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为空时结束
     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()



四、 疑问
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组件焦点切换原理

android 布局文件中 view 焦点获取浅析
自己控制焦点的移动

让ViewGroup中的子View获得焦点


 android焦点问题
通过配置文件,自己控制前后左右下一个焦点view是哪个