在全屏模式下,Android软键盘可隐藏CordovaWebView的输入

时间:2013-06-19 15:05:54

标签: android webview cordova android-softkeyboard

我有一个CordovaWebView,它提供了一些html表单。当我专注于输入字段时,会弹出Android的软键盘,对于某些字段,根据它们的位置,它会在它上面显示。基本上,它没有调整CordovaWebView的布局。

无论我做什么,我都无法改变这一点,据说这与CordovaWebView处于全屏模式这一事实有关。

如何解决此问题?

PS:不是吗,不是吗?

谢谢大家!

3 个答案:

答案 0 :(得分:5)

事实上,正如@ 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:这仅在视口以devicedpi为目标时才起作用,因为我们需要修改关于设备dpi的差异的方式。

PS2:第一批代码不是我的,我只编辑以满足我的需求。我在一个问题上看到了这一点,但不幸的是现在我找不到它。如果我找到了,我会在这里发布链接。

答案 1 :(得分:1)

我有同样的问题,我发现这是一个众所周知的错误。

解决方法可能是你写一个插件,在软键盘弹出之前禁用全屏,然后重新启用它。

答案 2 :(得分:0)

从清单中删除android:theme="@android:style/Theme.NoTitleBar.Fullscreen",并添加以下两行代码:

requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().addFlags(LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);

确保您的onCreate方法如下所示:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().addFlags(LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);

        super.onCreate(savedInstanceState);
        setContentView(R.layout.yourLayout);

        // Your code ...
}

一切都会奏效:D。