android开启辅助功能后GridView控件导致app闪退
app上线前遇到一个很诡异的问题,同一款型号的手机,一台手机没问题,另一台手机则在显示首页后假死、然后直接闪退。经过排查,确定是自定义GridView惹的祸,异常信息如下:
1 | java.lang.IllegalArgumentException: parameter must be a descendant of this view |
直接在网上搜这个异常信息,会出来类似的问题,比如这个帖子,这些帖子给出的异常信息相似,最后给出的解决方案也类似,都是说焦点问题,只要调用clearFocus就可以了(这个清楚焦点的操作可以在多个地方进行),但我都试过,发现这些方法都没法解决我遇到的问题。后来通过同事试用app反馈,发现只要打开android系统的辅助功能(android accessibility 比如开关控制、放大手势之类的,不同手机菜单名可能不一样,比如MIUI中是在“无障碍”中的那些功能),就会出现这个问题。然后重新搜,发现是“检测窗口内容(检查您正与其他互动的窗口的内容)”这个功能导致的,在React项目也存在该问题,参考如下链接 传送门 以我的使用场景为例,在我修改GridView后,添加view似乎并不是像其他控件那样,把新添加的View加到整个ViewTree中,而使用辅助功能时,需要从ViewTree的根遍历到所有叶子View,到GridView这一层没法往下走,才导致了上述问题。实际上,看异常也可以看到是在涉及accessibility相关方法时出错,所以只要在GridView中添加如下代码即可解决:
1 | @Override |