実際、@ 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の質問でそれを見ましたが、不幸にも私はそれを見つけることができません。もし私がそれを見つけたら、ここにリンクを掲示します。
"lastValue"を取得する方法? –
@AnasAzeem onCreate()の場合、私は 'lastValue = 0'を初期化します。これを例に追加するのを忘れてしまった。乾杯! –