Android WebView getContentHeight()始终返回0

时间:2014-04-15 20:10:01

标签: android android-webview

我正在实现一个WebView,它可以根据内容高度调整其高度。我试着做以下事情:

WebView view = new WebView(context);
view.loadData(htmlString, "text/html", "utf-8");

view.setWebViewClient(new WebViewClient() {
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        Log.d("2", view.getContentheight() + "");
        // Set the height of the webview to view.getContentHeight() here?
    }
});

Log.d("1", view.getContentHeight() + "");

其中htmlString是HTML格式的字符串。

但是两个Logs都返回0。

我不确定我做的是否正确。如何知道内容高度,然后相应地设置WebView的高度?

4 个答案:

答案 0 :(得分:9)

这是因为onPageFinished回调意味着WebView已经完成从网络读取字节,就是这样。在点onPageFinished时,页面可能甚至无法解析。

如果您的webview的高度设置为wrap_contents,那么您可以执行以下操作:

WebView v = new WebView() {
    @Override
    public void onSizeChanged(int w, int h, int ow, int oh) {
        super.onSizeChanged(w, h, ow, oh); // don't forget this or things will break!
        Log.d(TAG, "WebView height" + getContentHeight());
    }
};

如果你的webview不是wrap_contents,那么可以选择josedlujan在his answer中为这个问题做的建议,并从JavaScript中获取高度。

另一个选择是使用已弃用的PictureListener

webview.setPictureListener(new PictureListener() {
    int previousHeight;
    @Override
    public void onNewPicture(WebView w, Picture p) {
        int height = w.getContentHeight();
        if (previousHeight == height) return;
        previousHeight = height;
        Log.d(TAG, "WebView height" + height); 
    }
});

答案 1 :(得分:1)

您可以使用网页视图中的javascript获取高度和宽度。

WebView view = new WebView(context);
view.loadData(htmlString, "text/html", "utf-8");
view.getSettings().setJavaScriptEnabled(true);
view.setSaveEnabled(true);
view.addJavascriptInterface(new JavaScriptInterface(), "HTMLOUT");
view.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url){
  view.loadUrl("javascript:window.HTMLOUT.getContentHeight
        (document.getElementByTagName('html')") 
    }
});
view.loadDataWithBaseURL(null,htmlString,"text/html","utf-8,null");

   }



 class JavascriptInterface{
   public void getContentHeight(String value){
       if (value != null){
          webviewContentHeight = Integer.parseInt(value);
             Log.d(LOG_TAG("result from js"+webviewContentHeight);
             Toast.makeText(activity,"Content Height is:"+webviewContentHeight,
                     Toast.LENGTH_SHORT).show();
           }
       }
   }

答案 2 :(得分:1)

这是在视图完成加载时获取webview scrollheight的工作代码:

WebView webviewPageTest=new WebView(this);
webviewPageTest.getSettings().setJavaScriptEnabled(true);
class JsObject {
    @JavascriptInterface
       public void toString(String jsResult) {
           Log.v("scrolH:",jsResult);
           //use this if you need actual onscreen measurements 
           //float webViewHeight = (Integer.parseInt(jsResult) * getResources().getDisplayMetrics().density);
       }
    }

webviewPageTest.addJavascriptInterface(new JsObject(), "HTMLOUT");
webviewPageTest.setWebViewClient(new WebViewClient() {
    public void onPageFinished(WebView view, String url) {
        view.loadUrl("javascript:( function () { var h = document.body.scrollHeight; window.HTMLOUT.toString(h); } ) ()");
        }
    });

this.addContentView(webviewPageTest, params);

在这里工作Łukasz Sromek和josedlujan以及android dev docs

答案 3 :(得分:-3)

  

您可以通过在onPageFinished()

中提供一些延迟来实现此目的
webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    int contentHeight = webView.getContentHeight();
                    int viewHeight = webView.getHeight();
                    Toast.makeText(context, "*** " + contentHeight + " - " + viewHeight, Toast.LENGTH_SHORT).show();
                }
            }, 500);
        }
    });