我遇到的问题是WebView没有重新调整大小。我不确定如何解决这个问题。我的应用程序中的ListView上面有一个带有自定义webViewClient的webView。 WebView内部有一个动态手风琴。当我点击手风琴时它会展开,当我再次点击它时,它会再次展开或缩回。
我遇到的问题是,当内容缩回时,webView会保持其扩展的大小,从而在我的webView底部产生大量空白区域。有没有办法在重新加载webView的webView的ontouch方法中调用invalidate或setHeight?或者webViewClient中的一些覆盖方法可以处理这个?
答案 0 :(得分:1)
我猜你的身高设置为'wrap_content'。您观察到的行为是由于WebView中的错误而导致的,并已在4.4(KitKat)中修复。
没有好的解决方法 - 你可以尝试在每次点击手风琴时暂时强制WebView的高度回到0,但这会导致故障。或者 - 如果您控制您的内容,您可以更改单击手风琴时运行的JavaScript,以告诉WebView它应缩小回以前的高度:
class MyWebView {
private int previousHeight = -1;
@Override
public void onSizeChanged(int w, int h, int ow, int oh) {
super.onSizeChanged(w, h, ow, oh);
previousHeight = h;
}
public void accordionClicked() {
// I'm assuming the accordion is a toggle, so if you click it once
// it expands, you click it again - it shrinks.
LayoutParams lp = getLayoutParams();
if (lp.height == LayoutParams.WRAP_CONTENT)
lp.height = previousHeight;
else
lp.height = LayoutParams.WRAP_CONTENT;
setLayoutParams(lp);
}
}
然后,您需要使用addJavaScriptInterface
来公开JavaScript拨打accordionClicked
的方式:
class JsInterface {
private final WebView webView;
public JsInterface(WebView webView) {
this.webView = webView;
}
@JavascriptInterface
public void onAccordionClicked() {
webView.post(new Runnable() {
@Override
public void run() {
webView.accordionClicked();
}
});
}
}
然后,您可以在新建WebView的同一位置注册此界面:
webView.addJavaScriptInterface("jsInterface", new JsInterface(webView);
最后,在您的JavaScript中调用它:
function accordionClicke() {
...
jsInterface.onAccordionClicked();
}
如果您的手风琴更复杂,您可以用JavaScript计算内容的高度并将其传递回WebView:
jsInterface.onAccordionClicked(document.body.clientHeight);
然后使用它来设置正确的高度:
public void accordionClicked(int heightCss) {
LayoutParams lp = getLayoutParams();
lp.height = (int) (heightCss * getScale());
setLayoutParams(lp);
答案 1 :(得分:0)
在包装布局上使用:android:descendantFocusability="blocksDescendants"
这将阻止webview跳转到其开始
使用:webView.clearView();
mNewsContent.requestLayout();
每当您更改 webview 尺寸以使布局无效时,这将删除空间距
了解更多信息see:
答案 2 :(得分:0)
实际上还有一种方法。在更新内容之前使用此选项:
myWebView.loadUrl("about:blank");