8

いくつかの html フォームを表示する CordovaWebView があります。入力フィールドにフォーカスすると、Android のソフト キーボードがポップアップし、特定のフィールドでは、その位置に応じてその上に表示されます。基本的にCordovaWebViewのレイアウトのリサイズではありません。

これは何をしても変えられず、CordovaWebView がフルスクリーンモードになっていることが関係していると言われています。

これを解決するにはどうすればよいですか?

PS: それはバグですか?

皆さん、ありがとうございました!

4

3 に答える 3

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 では、この問題を処理するために次の 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の質問でそれを見ましたが、残念ながら今は見つかりません。もし見つけたら、ここにリンクを貼ります。

于 2013-06-21T12:15:33.010 に答える