我有一个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:第一部分代码不是我的,我只是为了满足需要而进行了编辑。我在一个特别的问题上看到了这一点,但不幸的是,现在我找不到了。如果找到它,我将在此处发布链接。

10-06 10:20