【Android学习笔记】解决ScrollView嵌套WebView问题

      官方文档是不推荐WebView外面还嵌套ScrollView的,但是有时候需求是要的,这里面其实挺多坑的。

      1、webview底部留白

      2、webview跳转页面后没有自动滑到顶部

      查了很久资料,终于找到终极解决办法(其实就是网上各种办法拼凑在一起):

1、我这里是平板,需要webview自适应

WebSettings settings = mWebView.getSettings();
settings.setPluginState(WebSettings.PluginState.ON);
settings.setJavaScriptEnabled(true);
settings.setRenderPriority(WebSettings.RenderPriority.HIGH);
settings.setSupportZoom(true);
settings.setBuiltInZoomControls(true);
settings.setDisplayZoomControls(false);
settings.setDomStorageEnabled(true);
// 适配设置
settings.setUseWideViewPort(true);
settings.setLoadWithOverviewMode(true);
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);

2、ScrollView 属性fillViewport="true",WebView外面必须包一层LinearLayout,不然会出现有时候留白的问题,我这里使用腾讯的WebView,你们可以自行替换原始的,所有的layout_height都要为wrap_content。



    

        
    

3、JS注入:WebView的setWebViewClient方法里在结束加载页面回调中要加入“mWebView.loadUrl("javascript:App.resize(document.body.getBoundingClientRect().height)"); ”

scrollview.fullScroll()这个方法是每次加载完webview都将webview顶置

还需要重新测量一下webview的宽高。

 public void onPageFinished(WebView view, String url) {
                DebugUtils.printLogE("onPageFinished");
                mWebView.loadUrl("javascript:App.resize(document.body.getBoundingClientRect().height)");
                super.onPageFinished(view, url);
                scrollView.fullScroll(ScrollView.FOCUS_UP);
                //这个是一定要加上那个的,配合scrollView和WebView的height=wrap_content属性使用
                int w = View.MeasureSpec.makeMeasureSpec(0,
                        View.MeasureSpec.UNSPECIFIED);
                int h = View.MeasureSpec.makeMeasureSpec(0,
                        View.MeasureSpec.UNSPECIFIED);
                //重新测量
                mWebView.measure(w, h);
            }
@JavascriptInterface
public void resize(final float height) {
    getActivity().runOnUiThread(new Runnable() {
        @Override
        public void run() {
            //Toast.makeText(getActivity(), height + "", Toast.LENGTH_LONG).show();
            mWebView.setLayoutParams(new LinearLayout.LayoutParams(getResources().getDisplayMetrics().widthPixels, (int) (height * getResources().getDisplayMetrics().density)));
        }
    });
}

应该可以解决大部分人的问题了。

你可能感兴趣的:(android)