我有一个显示一些 html 表单的 CordovaWebView。当我专注于输入字段时,Android 的软键盘会弹出,并且对于某些字段,根据它们的位置,它会出现在上面。基本上,它不会调整 CordovaWebView 的布局。
无论我做什么,我都无法改变这一点,据说这与 CordovaWebView 处于全屏模式有关。
我该如何解决这个问题?
PS:这是不是一个错误?
谢谢你们!
我有一个显示一些 html 表单的 CordovaWebView。当我专注于输入字段时,Android 的软键盘会弹出,并且对于某些字段,根据它们的位置,它会出现在上面。基本上,它不会调整 CordovaWebView 的布局。
无论我做什么,我都无法改变这一点,据说这与 CordovaWebView 处于全屏模式有关。
我该如何解决这个问题?
PS:这是不是一个错误?
谢谢你们!
事实上,正如@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 的差异的方式。
PS2:第一段代码不是我的,我只是为了满足我的需要而编辑的。我在一个 SO 问题上看到了这一点,但不幸的是现在我找不到它。如果我找到它,我会在这里发布链接。
我有同样的问题,我发现这是一个众所周知的错误。
一种解决方法可能是您编写一个插件,在软键盘弹出之前禁用全屏并在之后重新启用它。
从清单中删除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。