WebView无法自适应大小

7
我已经开发了一个针对Firefox OS的Web应用程序,但我希望使其在Android上“本地”运行。我的应用程序由一个对话框组成,它是一个 div ,当可见时填充整个页面,我使用了Firefox响应式设计工具进行测试,并且它可以正确地调整大小。当软键盘出现时,我希望对话框能够调整到剩余的视口大小,因为对话框底部有一些按钮。
我创建了一个只包含一个WebView的单个活动应用程序。我希望当键盘出现时视图可以调整大小,所以我使用了:
android:windowSoftInputMode="stateUnspecified|adjustResize"

当键盘出现时,似乎不会对WebView造成任何影响。我在网上搜索后发现很多人抱怨这个问题,但他们都有一个共同点,即使用 Theme.Black.NoTitleBar.Fullscreen 主题,而我没有使用该主题。我尝试了所有解决方案,但没有一个有效。
于是我开始怀疑是否存在WebView中的一个 bug 导致它无法调整大小。因此,我编写了一个自定义的View,在 onLayout 中打印了尺寸。
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    Log.d(TAG, t + " " + r + " " + b + " " + l);
}

果然,当键盘出现和消失时,视图大小正在正确调整。所以,我进行了更多的研究,并找到了一些答案,称您需要隐藏WebView、重新加载它,然后再次显示它。

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    Log.d(TAG, t + " " + r + " " + b + " " + l);

    mWebView.setVisibility(View.GONE);
    mWebView.layout(l, t, r, b);
    mWebView.invalidate();
    mWebView.reload();
    mWebView.setVisibility(View.VISIBLE);
}

再次说明,这并没有解决我的问题。(另外一点是,这是一个只有一个.html文件的Web应用程序,JS会在运行时更改应用程序中所有元素的状态,因此重新加载不是一个选项。)

我的问题是,当键盘可见时,是否有人知道一种在内容加载后调整 WebView 大小的方法。


我以前从未遇到过这个问题。我的Webview及其内容始终可以正确地调整大小。您使用的是哪种设备进行测试?此外,我使用“stateHidden | adjustResize”。 - Ifrit
哇...你说得对!我创建了一个空的HTML页面,其中包含一个fixed定位的div,并且它按预期进行了调整大小。问题在于,由于WebKit中的一个错误导致fixed元素不会对任何-webkit-transform做出反应,所以我必须使用position: absolute;,因此我必须找到另一种方法。 - Tom Leese
很高兴能帮忙。总的来说,我发现使用WebView太容易出现错误(特别是在不同设备之间),因此会尽量避免使用它们。 - Ifrit
2个回答

4
这并不完全是您问题的答案,但您会注意到当WebView变大时它确实重新调整大小,但当内容高度减小时并不会减小,就像我已经在这个问题上回答过的那样:WebView height = wrap_content with changing font size doesn't work。这个bug/特性在Google的问题跟踪器上有所提及:https://code.google.com/p/android/issues/detail?id=18726。请不要怪罪于我,我只是想指出如果您在使用WebView时遇到了其他问题,请参考以上内容。

2
问题原因是我在一个position为fixed的div中使用了position为absolute的元素。外部的div可以正常调整大小,但内部的div却不能。我必须使用position:absolute是因为WebKit存在一个bug,即无法对固定定位的div进行transform。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接