我有一个CordovaWebView,它呈现一些html形式。当我专注于输入字段时,会弹出Android的软键盘,并且对于某些字段,根据其位置,它会位于其上方。基本上,它不会调整CordovaWebView的布局大小。
无论我做什么,我都无法更改,据说这与CordovaWebView处于全屏模式有关。
我该如何解决呢?
PS:是还是不是bug?
谢谢你们!
最佳答案
实际上,正如@ user2493245所说,这是一个众所周知的错误。但是我发现了一种解决方法,至少在我的具体情况下。
在WebView上,只需检查View可见区域的坐标即可。
final View activityRootView = this.root;
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
public void onGlobalLayout() {
Rect r = new Rect();
//r will be populated with the coordinates of your view that area still visible.
activityRootView.getWindowVisibleDisplayFrame(r);
int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
if(heightDiff != lastValue) {
if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
appView.sendJavascript("onKeyBoardShow(" + r.bottom + ");");
} else {
appView.sendJavascript("onKeyBoardHide();");
}
lastValue = heightDiff;
}
}
});
如您所见,我将该信息发送到WebView。在HTML上,我有两种方法可以解决此问题:
function onKeyBoardShow(bottom) {
var diff = ($('input[type=text]:focus').offset().top - bottom) + 50;
if(diff > 0) {
$('body').css("top", (diff * -1) + "px");
}
};
function onKeyBoardHide() {
$('body').css("top", "0px");
};
基本上,在onKeyBoardShow上,它使输入字段聚焦,并计算移动主体所需的像素数量,从而使用户可以看到输入字段。 onKeyBoardHide,只需将主体置于其原始位置即可。
PS:仅当视口(viewport)以devicedpi为目标时,此功能才起作用,因为我们需要修改获取有关设备dpi的dif的方式。
PS2:第一部分代码不是我的,我只是为了满足需要而进行了编辑。我在一个特别的问题上看到了这一点,但不幸的是,现在我找不到了。如果找到它,我将在此处发布链接。