【问题标题】:Android WebView getContentHeight() always returns 0Android WebView getContentHeight() 总是返回 0
【发布时间】:2014-05-30 09:15:24
【问题描述】:

我正在实现一个 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 格式的字符串。

但是两个日志都返回 0。

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

【问题讨论】:

    标签: android android-webview


    【解决方案1】:

    这是因为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); 
        }
    });
    

    【讨论】:

      【解决方案2】:

      这是在视图完成加载时获取 webview 滚动高度的工作代码:

      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】:

        您可以在 webview 中使用 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();
                   }
               }
           }
        

        【讨论】:

        • 获取高度方法没有被调用!!
        【解决方案4】:

        您可以通过在 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);
                }
            });
        

        【讨论】:

          猜你喜欢
          • 2023-02-16
          • 1970-01-01
          • 2018-05-29
          • 1970-01-01
          • 2015-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-29
          相关资源
          最近更新 更多