有两种获取焦点的方式,一种是用户自己使用上下左右的方向键移动焦点,另外一种方式是直接调用视图的View.requestFocus()方法,前一种方法最终也是调用requestFocus。
* 遇到问题
问题描述:
前两天修改一个BUG遇到问题,使用上下把焦点放到一个view上,当锁住屏幕解开屏幕后,焦点会转移到其他view上。
查找出错原因:
查了下是ViewGroup中child view的focusable忘记清理,锁屏在解屏执行行Activity相应的生命周期方法(2.3 会执行 onPause - onResume 4.0会执行 onPause - onStop - onReStart - onStart - onResume),在onResume中进行invalidate,执行了重绘操作,因为之前没有手动清理child view的 setFoucsable = false 所以焦点会跑到此ViewGroup上。
解决方案:
好了,找到问题在哪了,之后就考虑怎么改,在什么地方添加清理操作。在ViewGroup的child view间切换焦点没有使用系统的,而是自定义代码指定下一个焦点位置。清理操作第一想到的是onFoucsChangeed回调方法,当时想当焦点移出ViewGroup时,ViewGroup 和 ChildView会同时执行相应的onFoucsChanged回到,但是打LOG后效果并不是自己设想的效果。
不对? 难道从ViewGroup的child View移出焦点时,ViewGroup和child View不会同时获取到焦点改变通知?
问题出在哪?
onFoucsChanged回调的调用时机理解有误,自己写一个Demo测试下,看ViewGroup与其child View是如何执行的?
Demo验证

疑问:
1. 按上下左右键,只在View间切换,相应的ViewGroup不会,下一个focus是什么位置,肯定由Android处理的,但到底怎么处理的?
问题相关资料,先留个疑问,以后如果遇到再详细分析:
通过配置文件,自己控制前后左右下一个焦点view是哪个
自己控制焦点的移动