欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

NestedScrollView嵌套WebView加载成功内容显示空白问题解决

程序员文章站 2022-06-04 14:47:55
...

因为需求问题需要采用CoordinatorLayout+AppBarLayout+ViewPager+NestedScrollView+WebView布局方式,虽然Google官方不建议NestedScrollView+WebView的嵌套使用,但是为了需求实现,实在是没有找到其他的可替代方案,只能是采用此方法了。

因为采用此方案,相关的问题也随之而来,其中最大的问题就是,WebView内容成功加载完成之后,内容显示一片空白,无法正常显示内容,为了能使内容正常显示,我google了各种方案,最后突然想到,既然可以正常加载完成,无法显示,是不是因为两者嵌套导致高度为0的原因,因此尝试着在Webview加载完成之后,重新计算一下高度:

//webview加载完成之后重新测量webview的高度
ViewGroup.LayoutParams params = mWebView.getWebView().getLayoutParams();
params.width = getResources().getDisplayMetrics().widthPixels;
params.height = mWebView.getHeight() - mSrollView.getHeight();
mWebView.getWebView().setLayoutParams(params);

这样就可以正常显示了,最后附上NestedScrollView+WebView嵌套时,webView可滑动范围的计算方式:

正常获取:

mainWebView.getContentHeight()//获取html高度

mainWebView.getScale()//手机上网页缩放比例

mainWebView.getHeight()//WebView控件的高度

mainWebView.getContentHeight() * mainWebView.getScale()//得到的是网页在手机上真实的高度

mainWebView.getContentHeight() * mainWebView.getScale()-mainWebView.getHeight()//减去webview控件的高度得到的是网页上下可滚动的范围

mWebViewTotalHeight = mainWebView.getContentHeight() * mainWebView.getScale() - mainWebView.getHeight();

如果WebView是嵌套在ScrollView里:

mainWebView.getHeight()//此时WebView控件的高度 == 网页内容真实的高度,因为webview嵌套在ScrollView里,WebView的控件高度会根据网页内容自动改变

mScrollView.getHeight()//ScrollView控件的高度

mWebViewTotalHeight = mainWebView.getHeight() - mScrollView.getHeight();

总结:要获取WebView上下滚动的范围,首先要得到网页内容真实的高度,然后减去外层容器的高度