実際、@ 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 では、この問題を処理するために次の 2 つの方法があります。
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: これは、デバイスの dpi に関する差分を取得する方法を変更する必要があるため、viewport が devicedpi をターゲットにしている場合にのみ機能します。
PS2: 最初の量のコードは私のものではありません。私は自分のニーズを満たすために編集しただけです。SOの質問でそれを見ましたが、残念ながら今は見つかりません。もし見つけたら、ここにリンクを貼ります。