Android WebView getContentHeight()始终返回0

dar*_*ord 6 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() + "");
Run Code Online (Sandbox Code Playgroud)

其中htmlString是HTML格式的String.

但是两个Logs都返回0.

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

mar*_*iba 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());
    }
};
Run Code Online (Sandbox Code Playgroud)

如果你的webview不是wrap_contents,那么一个选项是做josedlujan在对这个问题的回答中提出的建议并从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); 
    }
});
Run Code Online (Sandbox Code Playgroud)


jos*_*jan 3

您可以使用 javascript 从 webview 获取高度和宽度。

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();
           }
       }
   }
Run Code Online (Sandbox Code Playgroud)