引言
项目中用了头条适配的方案。关于头条适配网上很多讲解字节跳动头条适配方案,我这边就不多说了,第一次看到的时候感觉还是很牛逼的,都是些什么人这么巧的方案都能想到,哎。用了一两个项目了感觉很不错很省心,但是昨天突然发现不好用了,但是很难复现。经过多次尝试发现了复现的步骤
复现步骤
首页基本上采用一个Activity多个Fragment的方式实现,问题就出在当进入Activity的时候创建了当前的Fragment另外的几个Fragment还没有被创建,这个时候打开一个Web页面然后返回到首页,然后切换到其他的Fragment可以看到适配方案并没有在该Fragment中生效
这个webview是基于AgentView来实现的。但是在另外的一个TencentX5的项目中也用了该适配方案,但是没有复现该问题。然后就在纠结是不是web导致的。重新创建了原生的webview,经过一系列的操作,和AgentWeb一样能完美复现
找问题
发现了啥问题导致的就开始断点打日志的日常操作。
第一次
打印修改density的地方看每次修改的density是否一致
运行了发现完全一致没有不一致的。后来想了一下好像傻逼了,因为修改density是在Activity的onCreate里面处理的。这之前啥都没做后面有没有改咱也不知道,也不敢问啊
第二次
修改density地方继续打印,然后web加载成功后打印当前页面的density
1 | V/Logger: onCreate density:432 |
真的会改density啊
原因
所以核心问题就是修改了activity的density,但是加载webview的时候density会被重置。
原来理解的是修改density是针对页面的density,你在A页面修改了density然后切换到B页面了B页面的density会和A页面的density不一致,但是事实上他们用的确实是同一个
在修改的density的时候打印了初始density和结束density发现就第一个页面的density是初始值后面的页面获取到的density都是修改后的density
1 | V/Logger: density start:480 |
这也就解释了为啥Web页面回来后创建fragment用的activity的density不是修改后的density了,被web重置了
而X5下加载web onPageFinished density:432并不会重置density,应该是内部处理了,用空研究下为啥普通的web会重置density而X5不会重置density
解决方案
之前是只在Activity的基类中调用了适配的方法,Fragment中没有调用适配方法,所以目前在Fragment的基类中创建view之前也加了一句适配的方案。