目录
  1. 1. 引言
  2. 2. 复现步骤
  3. 3. 找问题
  4. 4. 原因
  5. 5. 解决方案
头条适配和Webview的恩怨情仇

引言

项目中用了头条适配的方案。关于头条适配网上很多讲解字节跳动头条适配方案,我这边就不多说了,第一次看到的时候感觉还是很牛逼的,都是些什么人这么巧的方案都能想到,哎。用了一两个项目了感觉很不错很省心,但是昨天突然发现不好用了,但是很难复现。经过多次尝试发现了复现的步骤

复现步骤

首页基本上采用一个Activity多个Fragment的方式实现,问题就出在当进入Activity的时候创建了当前的Fragment另外的几个Fragment还没有被创建,这个时候打开一个Web页面然后返回到首页,然后切换到其他的Fragment可以看到适配方案并没有在该Fragment中生效

这个webview是基于AgentView来实现的。但是在另外的一个TencentX5的项目中也用了该适配方案,但是没有复现该问题。然后就在纠结是不是web导致的。重新创建了原生的webview,经过一系列的操作,和AgentWeb一样能完美复现

找问题

发现了啥问题导致的就开始断点打日志的日常操作。

第一次
打印修改density的地方看每次修改的density是否一致
运行了发现完全一致没有不一致的。后来想了一下好像傻逼了,因为修改density是在Activity的onCreate里面处理的。这之前啥都没做后面有没有改咱也不知道,也不敢问啊
第二次
修改density地方继续打印,然后web加载成功后打印当前页面的density

1
2
V/Logger: onCreate density:432
V/Logger: onPageFinished density:480

真的会改density啊

原因

所以核心问题就是修改了activity的density,但是加载webview的时候density会被重置。

原来理解的是修改density是针对页面的density,你在A页面修改了density然后切换到B页面了B页面的density会和A页面的density不一致,但是事实上他们用的确实是同一个

在修改的density的时候打印了初始density和结束density发现就第一个页面的density是初始值后面的页面获取到的density都是修改后的density

1
2
3
4
V/Logger: density start:480
V/Logger: density end:432
V/Logger: density start:432
V/Logger: density end:432

这也就解释了为啥Web页面回来后创建fragment用的activity的density不是修改后的density了,被web重置了

而X5下加载web onPageFinished density:432并不会重置density,应该是内部处理了,用空研究下为啥普通的web会重置density而X5不会重置density

解决方案

之前是只在Activity的基类中调用了适配的方法,Fragment中没有调用适配方法,所以目前在Fragment的基类中创建view之前也加了一句适配的方案。

文章作者: sovwcwsfm
文章链接: http://sovwcwsfm.com/2019/11/15/%E5%A4%B4%E6%9D%A1%E9%80%82%E9%85%8D%E5%92%8CWebview%E7%9A%84%E6%81%A9%E6%80%A8%E6%83%85%E4%BB%87/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 _L