踩坑之路——Android6.0以上Dialog抢焦点导致状态栏设置失效
现象描述
- 项目中使用WebView加载H5页面数据,因H5页面与app主题颜色不一致,所以修改状态栏(StatusBar)背景色和字体颜色,重新设置;同时考虑WebView启动显示空白页太单调,于是在启动过程中显示一个ProgressDialog,加载完成后隐藏。
整体业务逻辑功能和代码实现都比较简单,所以也没有仔细考虑,就直接上代码,完了就上测试。测试页面时发现该页面的状态栏有问题,6.0以上的手机有的是空白不显示,有的显示不完整,而我自己的6.0测试机又是正常的。看到这个结果,完全不敢相信——这么简单的功能和代码,会导致这么严重的后果!
处理过程
- 第一反应问题出在没有设置沉浸式状态栏,于是查看XML布局文件,但结果配置了,所以不是这里引起的;
- 既然设置了沉浸式状态栏,觉得问题是改变状态栏引起的,肯能设置状态栏没有生效,于是各种查资料百度,最后搜索到的结果是我写的状态栏工具类的设置方法没有问题(要考虑不同手机、不同版本等问题);
- 继续思考和查看问题,发现只有这个页面出现问题而其他页面正常,觉得可能是布局引起的,可是布局非常简单,也就WebView特殊和复杂一点,于是把WebView布局和相关逻辑代码注释,结果状态栏设置生效了,于是觉得问题就是WebView没有设置某项属性引起的,开始上网搜索查资料,可是没有找到类似的问题,思路就此断了;
- 最后实在没办法,既然是WebView引起的但又不得不用,就尝试一下显示空白页面,不添加任何设置、不加载数据和处理任何业务逻辑,尝试结果就是状态栏正常;问题处理到这里,那就只能用最傻的办法,就是不停的尝试,一个个设置添加,再把业务逻辑从简单到复杂一步步添加上去,最后发现罪魁祸首就是ProgressDialog。于是百度一下,才了解到ProgressDialog在获取焦点时会抢了整个Window的焦点,导致状态栏设置不生效。最后放弃它使用其他方式代替。
最后
这次花了整整一天时间处理这个Bug,虽然解决了问题,但是还是强调一下,能不用Dialog就尽量不要使用,使用其他方式替代,毕竟google官方都已经遗弃了。