2013-06-19 12 views
8

私はCordovaWebViewをいくつかのhtml形式で表示しています。入力フィールドに注目すると、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"を外し、コードのこれらの2行を追加します。

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

これは動作しません! –

関連する問題