SetSize WebView Android

时间:2014-03-25 09:38:29

标签: java android webview android-webview

我遇到的问题是WebView没有重新调整大小。我不确定如何解决这个问题。我的应用程序中的ListView上面有一个带有自定义webViewClient的webView。 WebView内部有一个动态手风琴。当我点击手风琴时它会展开,当我再次点击它时,它会再次展开或缩回。

我遇到的问题是,当内容缩回时,webView会保持其扩展的大小,从而在我的webView底部产生大量空白区域。有没有办法在重新加载webView的webView的ontouch方法中调用invalidate或setHeight?或者webViewClient中的一些覆盖方法可以处理这个?

3 个答案:

答案 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");