vlambda博客
学习文章列表

webview 在recyclerview中显示不全的问题

中国移动家庭运营中心融合通信 代敏

关于webview 在recyclerview中显示不全问题的解决方案

近日,和家亲APP终于迎来了6.0的大改版,在智能页面增加了全屋智能的主入口,将智能收拢聚合,让实现屋内屋外一键切换,看似简单,在实现的时候却让开发废了不少劲儿,我们来一起看看开发遇到了什么问题吧?

要展示全屋智能和设备两个tab,本身在一般的页面实现并不复杂 开发一开始也觉得难度不大,可是真正实现的时候,发现H5开发的全屋智能无法展示完全。

分析原因,智能页面的UI布局如下:

加载H5页面时为了尽可能复用工程中现有代码,使用了公共组件封装的Fragment,其中Fragment核心功能就是加载H5,并且注册了和家亲APP常用的JS能力,RecyclerView加载Fragment作为它的Item时,因为Fragment无法提前计算高度,加载H5webview就会出现展示不全的问题。

首先尝试将webview设置为matchparent,并不起作用,一波搜索以后,最终解决方案还是要为RecyclerView的viewHolder设置为可展示完整H5的高度才可以。

一种解决思路,为ViewHolder设置一个固定高度,让viewHolder中加载Fragment的container撑满全屏,代码具体如下:

frameLayout = itemView.findViewById(R.id.frame_layout_fragment_container);RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) frameLayout.getLayoutParams();
layoutParams.height = RecyclerView.LayoutParams.MATCH_PARENT;

但是当webview高度超出一屏时或者小于一屏时,就会出现展示不全或者有空白的问题,无法彻底解决问题,倘若H5高度不变的话,就可以采用该方案,简单有效。

另外一种思路,就是在webview加载完成时,增加JS能力获取下webiview实际高度,动态这是viewHolder的实际高度,这样可以彻底解决webview显示的问题,但是需要H5开发支持,当native端获取webview高度时要将实际的高度返回给native侧。或者可以采用加载下列代码直接获取。

代码如下:

webview.loadurl("javascript:App.resize(document.body.getBoundingÇlientRect().height)");

以上两种方案均可以解决上面描述的问题,开发的同学们可以根据项目自己的实际情况择优选择。当然如果有同学有更好的解决方案的话,欢迎告诉我哈!


欢迎关注CC Tech