【问题标题】:SetSize WebView AndroidSetSize WebView Android
【发布时间】:2014-03-26 05:48:10
【问题描述】:

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

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

【问题讨论】:

  • 而webView的布局是什么?
  • WebView 在一个垂直的 LinearLayout 中。

标签: java android webview android-webview


【解决方案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);

【讨论】:

    【解决方案2】:

    在环绕布局上使用:android:descendantFocusability="blocksDescendants",这将阻止 webview 跳转到其开头

    使用:webView.clearView();mNewsContent.requestLayout(); 每次更改 webview 大小以使布局无效时,这将删除空白间距

    更多信息see:

    【讨论】:

      【解决方案3】:

      其实是有办法的。在更新内容之前使用它:

      myWebView.loadUrl("about:blank");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-06
        • 2017-05-02
        • 2015-11-12
        • 2016-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-21
        相关资源
        最近更新 更多