天天记录 - 一个onFocusChanged问题

在Android开发中,遇到一个焦点管理的问题:当屏幕解锁后,焦点不正确地转移。原因是child view的focusable未清除。解决方案在于理解和正确使用onFocusChanged回调。通过创建Demo验证,发现焦点切换的机制与预期不符,需要深入理解Android的焦点处理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值