我猜你的高度设置为“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);