Android WebView getContentHeight () always returns 0

I am embedding a WebView so that it can change its height according to the height of the content. I tried to do the following:

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() + ""); 

Where htmlString is an HTML format string.

However, both of these logs return 0.

I am not sure that I am doing the right thing. How do I know the height of the content and then set the height of the WebView?

+6
source share
4 answers

this is because the onPageFinished means that WebView has finished reading bytes from the network, thatโ€™s exactly what. When starting the onPageFinished point onPageFinished page cannot yet be parsed.

If your web view height is set to wrap_contents, you can do something like this:

 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()); } }; 

If your webview is not wrap_contents, then one of the options is to do what josedlujan suggested in his answer to this question and get the height from JavaScript.

Another option is to use an obsolete 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); } }); 
+9
source

you can get height and width using javascript from web view.

 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(); } } } 
+1
source

Here is the working code to get the webview scroll view by the watched download:

 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); 

worked here ลukasz Sromek and josedlujan above and here android dev docs

0
source

You can do this by providing some delay 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); } }); 
-2
source

All Articles