web-dev-qa-db-ja.com

Android webviewでキーボードの下に隠れているテキストボックス

通常のWebビューを含む単純なiPhone/Androidアプリを作成しました。このウェブビューは私のウェブサイトを呼び出します。

私のウェブサイトには、入力type = textまたはtextareaのフォームがいくつかあります。それらがページの一番下にあるとき、私はそれらに問題があります!

1)iPhoneアプリでは、キーボードが自動的に表示され、テキストボックスを電話画面の表示領域にプッシュします。だから何もすることはありません。

2)しかし、私のAndroidアプリでは、テキストボックスは同じ場所にとどまり、最終的にキーボードによって非表示になります。ユーザーが選択できる唯一のオプションは、「blind」と入力することです。

どうすれば修正できますか?他の誰かがこの問題に遭遇しましたか?

51
andreas

これが私が問題を解決した方法です。 Venkyが言ったように、あなたは追加する必要があります

Android:windowSoftInputMode="adjustResize"

androidManifest.xmlファイルのタグに追加します。しかし、私たちの場合、それは十分ではありませんでした。ビュー、Webビューなどでも同様にこれを行うようにしてください。それから、ようやく機能するようになりました。

44
andreas

何もうまくいかないAndroid:windowSoftInputMode="adjustResize"が役立つ場合がありますが、アプリを全画面表示にしないようにしてください。

アプリの全画面を削除することで、ソフトキーボードを使用したレイアウトのサイズ変更に関する問題を解決しました。

<item name="Android:windowFullscreen">false</item>
27
Sandro

これはうまくいくでしょう:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

3
Tsasaa

この問題の解決中に学んだことはほとんどありません--- 1.テーマスタイルにFullscreen Trueを含めないでください。2. Android:windowSoftInputMode = "adjustResize"を追加します。3. Android:scrollbars = "none"はany ..を削除します。乾杯!

2
Surjeet

私の場合、成功は以下によって達成されました。

  1. マニフェスト、Webビュー、およびフラグメントに以下を追加します。

    Android:windowSoftInputMode="adjustResize"
    
  2. 以下のようなNON FullScreenテーマの使用:

    <style name="AppTheme" parent="Android:Theme.Black.NoTitleBar">
        <item name="Android:windowNoTitle">true</item>
        <item name="Android:windowActionBar">false</item>
        <item name="Android:windowFullscreen">false</item>
    </style>
    
  3. WebViewでScrollViewを使用しない。
1
Pawel

全画面モードでのアクティビティの場合、Android:windowSoftInputMode = "adjustResize"は機能しません。

https://developer.Android.com/reference/Android/view/WindowManager.LayoutParams.html#FLAG_FULLSCREEN

フルスクリーンウィンドウは、ウィンドウのsoftInputModeフィールドのSOFT_INPUT_ADJUST_RESIZEの値を無視します。ウィンドウはフルスクリーンのままで、サイズ変更されません。

アクティビティで次のメソッドを使用して、下部のパディングを設定してレイアウトのサイズを変更します。


    public void adjustResizeOnGlobalLayout(@IdRes final int viewGroupId, final WebView webView) {
        final View decorView = getWindow().getDecorView();
        final ViewGroup viewGroup = (ViewGroup) findViewById(viewGroupId);

        decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            public void onGlobalLayout() {
                DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
                Rect rect = new Rect();
                decorView.getWindowVisibleDisplayFrame(rect);
                int paddingBottom = displayMetrics.heightPixels - rect.bottom;

                if (viewGroup.getPaddingBottom() != paddingBottom) {
                    // showing/hiding the soft keyboard
                    viewGroup.setPadding(viewGroup.getPaddingLeft(), viewGroup.getPaddingTop(), viewGroup.getPaddingRight(), paddingBottom);
                } else {
                    // soft keyboard shown/hidden and padding changed
                    if (paddingBottom != 0) {
                        // soft keyboard shown, scroll active element into view in case it is blocked by the soft keyboard
                        webView.evaluateJavascript("if (document.activeElement) { document.activeElement.scrollIntoView({behavior: \"smooth\", block: \"center\", inline: \"nearest\"}); }", null);
                    }
                }
            }
        });
    }
0
SiuFay

ええ、Webviewでの作業と同じ問題がありました。私の場合は、モーダルでファイルされた入力でした。テキストフィールドはキーボードの上に「フォーカス」しませんでした。解決策は、関数呼び出しを遅らせることでした。誰かがこれを見つけてくれることを願っています。

   $("body").on("click", ".jstree-search-input", function () {  

    setTimeout(function(){ 
        androidScroll(); 
    }, 500);
    });

ご覧のとおり、jstree入力に使用されています...

   function androidScroll() {
    // Webview focus call (pushes the modal over keyboard)
        $('.control-sidebar-open ').scrollTop($('.control-sidebar-open ')[0].scrollHeight);

}

0
Denis Solakovic

提案の回答とは別に注意してください

Android:windowSoftInputMode="adjustResize"

not没入型モードのときに動作します

0
unlimited101