我猜你有高度設置爲「WRAP_CONTENT」。你觀察到的行爲是由於WebView中的一個錯誤,並且已經在4.4(KitKat)中修復了。
這個bug沒有很好的解決方法 - 您可以嘗試暫時強制每次手風琴單擊時WebView的高度回到0,但這會導致故障。或者 - 如果你控制你的內容,你可以更改運行時手風琴點擊告訴的WebView,它應該退縮到以前的高度的JavaScript:
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);
什麼是webView所在的佈局? – sygi
WebView位於垂直LinearLayout內。 – sirFunkenstine