我正在实现一个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格式的字符串。
但是两个Logs都返回0。
我不确定我做的是否正确。如何知道内容高度,然后相应地设置WebView的高度?
答案 0 :(得分: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());
}
};
如果你的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);
}
});
答案 1 :(得分:1)
您可以使用网页视图中的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();
}
}
}
答案 2 :(得分:1)
这是在视图完成加载时获取webview scrollheight的工作代码:
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 :(得分:-3)
您可以通过在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);
}
});