天天记录 - 一个onFocusChanged问题



     有两种获取焦点的方式,一种是用户自己使用上下左右的方向键移动焦点,另外一种方式是直接调用视图的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验证
例子代码


      天天记录 - 一个onFocusChanged问题_第1张图片


疑问:
     1. 按上下左右键,只在View间切换,相应的ViewGroup不会,下一个focus是什么位置,肯定由Android处理的,但到底怎么处理的?

问题相关资料,先留个疑问,以后如果遇到再详细分析:
   android焦点问题
通过配置文件,自己控制前后左右下一个焦点view是哪个 

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


你可能感兴趣的:(android,测试)