2013-06-19 51 views
8

我有一个呈现一些html表单的CordovaWebView。当我专注于一个输入字段时,Android的软键盘弹出,对于某些字段,根据它们的位置,它会占据上风。基本上,它不调整CordovaWebView的布局。Android软键盘在全屏时隐藏CordovaWebView的输入

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

我该如何完成解决此问题?

PS:是的,还是不是,一个错误?

谢谢大家!

回答

5

事实上,这是一个众所周知的错误,正如@ user2493245所说。但是我发现了一个解决方法,至少在我的具体情况上。

在WebView上,只需检查视图可见区域的坐标。

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的DIF。

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

+0

如何获得“lastValue”? –

+0

@AnasAzeem当onCreate(),我初始化'lastValue = 0'。忘了将它添加到示例中。干杯! –

1

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

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

+0

感谢您的回答,但我找到了一个更简单的方法,我马上发帖。 :) –

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。

+0

这不起作用! –