13

I have a RelativeLayout with WebView. I am loading some generated html text into that WebView. After loading the data WebView height exceeding the screen. Now I need the height of the entire WebView. Till now I tried WebView#getHeight(), WebView#getBottom() but I'm getting the height of visible content.

How to get the total height of WebView.? screen height

shobhan
  • 1,400
  • 2
  • 12
  • 27

7 Answers7

13

Finally I got the answer for my question. Here is the answer.

After loading WebView we will get call in WebViewClient#onPageFinished there we need to call javascript to get the height of full content of WebView

WebViewClient class

/**
 * Custom web client to perform operations on WebView
 */
class WebClient extends WebViewClient {

    @Override
    public void onPageFinished(WebView view, String url) {
            view.loadUrl("javascript:AndroidFunction.resize(document.body.scrollHeight)");
        }
    }
}

After that we will get callback with height in WebInterface class which is Registered as JavascriptInterface

/**
 * WebView interface to communicate with Javascript
 */
public class WebAppInterface {

    @JavascriptInterface
    public void resize(final float height) {
        float webViewHeight = (height * getResources().getDisplayMetrics().density);
        //webViewHeight is the actual height of the WebView in pixels as per device screen density
    }
}
shobhan
  • 1,400
  • 2
  • 12
  • 27
  • resizing is crucial if actual height in screen pixels is needed. thanks a lot. – Boris Gafurov Jul 06 '17 at 04:14
  • hey, what is readWebView? Ah- an instance of WebAppInterface? – pale bone Sep 08 '18 at 02:24
  • No it's webView instance. Edited answer. Thanks man. I forgot that it's my answer. ;) – shobhan Sep 10 '18 at 13:10
  • how to use this class WebAppInterface – Nanda Z Mar 11 '19 at 09:49
  • go through this link https://developer.android.com/guide/webapps/webview#BindingJavaScript – shobhan Mar 11 '19 at 18:53
  • Since `WebViewClient.onPageFinished()` only gets called when the page had finished loading, this solution falls short when the size of the content changes post loading (e.g. Javascript content rendered after page finished loading, user interactions with expandable and collapsible sections) – trod Dec 02 '21 at 05:43
  • In this case we can have one more javascript call from web page when content is expanded/collapsed. – shobhan Dec 29 '21 at 16:50
6

Wrap your WebView within a ScrollView and webView.getHeight() will return the height of the actual WebView content. Make sure your WebView's height attribute is set to wrap_content.

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <WebView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </WebView>
</ScrollView>
Ivan
  • 555
  • 2
  • 9
  • 25
  • I tried this case also, but if we load 10 high quality images it is giving out off memory error. And one more thing keeping WebView in ScrollView is not recommended. – shobhan Apr 28 '17 at 05:39
  • @shobhan You're probably getting OOM because the images are much higher res than what the device can handle, consider if a high res image is 50mb, you load 10 = 250mb, and then on top of that you have the app, the os, etc. running on oftentimes devices with less than a gig of ram, you're going to kill your app quickly. – Trevor Hart Jul 20 '17 at 05:01
  • I think you tried to explain part of my above comment. (OOM out off memory error) :P Thanks. – shobhan Jul 20 '17 at 06:53
2
public class CustomWebView extends WebView{
    public CustomWebView(Context context) {
        super(context);
    }
    int ContentHeight = 0;
    public int getContentHeight(){
        if(ContentHeight==0)
            ContentHeight = computeVerticalScrollRange();
        return ContentHeight;
    }
}

Webview has protected method computeVerticalScrollRange(). you can access this method by creating custom one.

((CustomWebView) webView).getContentHeight())
mertsimsek
  • 256
  • 2
  • 10
0

My Answer:-

I think you have to remove padding properties from your layout.xml file

(i.e) Remove the following content from your XML file and try it.

android:paddingBottom    
android:paddingLeft    
android:paddingRight    
android:paddingTop

Hope it helps!!

Chris Stillwell
  • 9,821
  • 9
  • 70
  • 73
0

kotlin: myWebView.contentHeight

Leonid Ivankin
  • 485
  • 4
  • 8
-1

In your Java class add the getWindow()

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_webview);
}
-1
private int getScale(){
    Display display = ((WindowManager) 
    getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
    int width = display.getWidth(); 
    Double val = new Double(width)/new Double(PIC_WIDTH);
    val = val * 100d;
    return val.intValue();
}

check this link! for more information

Chris Stillwell
  • 9,821
  • 9
  • 70
  • 73
Rizwan
  • 141
  • 2
  • 8