Android一旦呈现就获得webview内容的高度

我试图在渲染后获得webview的高度。 它总是返回null,我尝试过getHeightgetMeasuredHeightgetContentHeight ,它总是返回null。

布局:

     

活动

 public class TestActivity extends MenuActivity { private final static String TAG = "HearingTest"; private String urlTopContent; private WebView topContent; private boolean mMoreInfoTop = true; private int mYdelta = 0; private int mBottomOffset = 0; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.right_hearing_test); String topHtml = this.getString(R.string.top_content); //String bottomHtml = this.getString(R.string.bottom_content); urlTopContent = "file:///android_asset/html/" + topHtml; WebViewSettings(); LoadWebPage(urlTopContent); } public void WebViewSettings(){ topContent = (WebView) findViewById(R.id.top_content); topContent.getSettings().setJavaScriptEnabled(true); topContent.getSettings().setBuiltInZoomControls(true); topContent.getSettings().setSupportZoom(true); topContent.getSettings().setLoadWithOverviewMode(true); topContent.setBackgroundColor(0); topContent.canGoBack(); int topHeight = topContent.getContentHeight(); Log.d("Top Height", "Height: " + topHeight); topContent.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (Uri.parse(url).getHost().equals(urlTopContent)) { // This is my web site, so do not override; let my WebView load the page return false; } // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); return true; } @Override public void onPageFinished(WebView view, String url) { View webViewHeight = (View) findViewById(R.id.top_content); int height = webViewHeight.getHeight(); Log.d("Top Content","Top Content Height:" + height); } }); } public void LoadWebPage(String url){ try { topContent.loadUrl(url); Log.d("Loading Web Page", "URL" + url + "connected"); } catch (Exception e) { Log.d("Loading Web Page", "URL: " + url + " couldn't connect."); } } } 

我甚至不知道在渲染后是否可以获得Web视图的高度,但我不明白为什么你不能。 如果任何人得到和解决方案,将不胜感激。

您可以在该WebView上使用ViewTreeObserver在呈现其内容后获取实际高度。

这是示例代码。

 ViewTreeObserver viewTreeObserver = mWebView.getViewTreeObserver(); viewTreeObserver.addOnPreDrawListener(new OnPreDrawListener() { @Override public boolean onPreDraw() { int height = mWebView.getMeasuredHeight(); if( height != 0 ){ Toast.makeText(getActivity(), "height:"+height,Toast.LENGTH_SHORT).show(); mWebView.getViewTreeObserver().removeOnPreDrawListener(this); } return false; } }); 

试过并测试了以下内容:

  mWebView = new WebView(this); mWebView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View view, int l, int t, int r, int b, int ol, int ot, int or, int ob) { Log.i("demo", String.format("%s: top=%d, bottom=%d, content height=%d", Thread.currentThread().getStackTrace()[2].getMethodName(), t, b, mWebView.getContentHeight() )); } }); 

日志:

12-20 16:08:33.969 1466-1466 / yourPkg I / demo:onLayoutChange:top = 0,bottom = 0,content height = 0
12-20 16:08:33.970 1466-1466 / yourPkg I / demo:onLayoutChange:top = 0,bottom = 0,content height = 0
12-20 16:08:34.061 1466-1466 / yourPkg I / demo:onLayoutChange:top = 0,bottom = 1510,content height = 0
12-20 16:08:34.091 1466-1466 / yourPkg I / demo:onLayoutChange:top = 0,bottom = 1510, content height = 2050

最后一个是正确的。
ViewTreeObserver有时会给我错误的高度。

我发现这个解决方案是100%可靠的。

对WebView进行子类化,并且需要在加载内容后调用javascript

 // callback made this way in order to get reliable html height and to avoid race conditions @SuppressLint("SetJavaScriptEnabled") override fun onPageFinished(view: WebView?, url: String?) { view?.let { it.settings.javaScriptEnabled = true it.addJavascriptInterface(WebAppInterface(it), "AndroidGetHeightFunction") it.loadUrl("javascript:AndroidGetHeightFunction.resize(document.body.scrollHeight)") } } 

然后我们可以获得适当的高度并在回调中禁用javascript (为了安全性和一致性):

 inner class WebAppInterface(private val webView: WebView) { @JavascriptInterface fun resize(height: Float) { webView.post { heightMeasuredListener?.invoke(formatContentHeight(webView, height.toInt())) webView.settings.javaScriptEnabled = false } } } 

WebView 必须调用post(),因为在WebView线程中调用resize(…)中的代码!

之后,请确保缩放像素以匹配密度像素 !:

 fun formatContentHeight(webView: WebView, height: Int): Int = Math.floor((height * webView.context.resources.displayMetrics.density).toDouble()).toInt()