NestedScrollView嵌套WebView加载成功内容显示空白问题解决
因为需求问题需要采用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上下滚动的范围,首先要得到网页内容真实的高度,然后减去外层容器的高度