Android:ソフトキーボードがビューを押し上げるのを防ぐにはどうすればよいですか?


386

アプリの下部に縦型のスライド式引き出しがあります。ソフトキーボードが開くと、引き出しのタブが押し上げられ、キーボードの上に配置されます。画面の下部に残しておき、キーボードが表示されたときに非表示にしたい。

他の誰かがこの問題に遭遇しましたか?それを修正する方法を知っていますか?


1
こんにちは、マニフェストファイルで使用したフラグと同じ問題が発生しています。解決に役立ててください
Nixit Patel

1
この質問は、ここで重複している:stackoverflow.com/questions/5516216/...
WonderWorkerを

回答:


656

アクティビティタグ内のファイルでアクティビティのwindowSoftInputModeフラグを切り替えるだけです。adjustPanAndroidMainfest.xml

詳細については、公式ドキュメントを確認してください。

<activity
   ...
   android:windowSoftInputMode="adjustPan"> 
</activity>

43
ビューをパンしたくはありません。ビューを静止したままにしておき、キーボードで覆い隠そうとするだけです。
クリストファーペリー

5
パンとは、ビューをスクロールして、入力しているビューを表示することを意味します。つまり、表示されたばかりのキーボードがフォーカスされたビューを覆っていなかった場合、それは静的なままです。
Alexander Oleynikov 2010年

18
私も同じ問題に直面しています。manifeast file。でwindowSoftInputModeフラグを「adjustPan」に設定しましたが、機能しませんでした。それを解決する方法
Subrat

20
画面の下部にボタンの行があり、その上にScrollViewがある場合は役に立ちません。windowSoftInputModeの値に関係なく、ボタンは押し上げられます。
Artem Russakovskii、2011年

3
フラグメントでは機能しません。断片化する方法は?
Prashanth Debbadwar

175

答えはどれもうまくいきませんでしたが、これはうまくいきました:

android:windowSoftInputMode="adjustNothing"

6
これにより、高さを再計算するためのレイアウトを作成することなく、キーボードがコンテンツに重なって表示されます。
2014年

13
これにより、キーボードがコンテンツを押し上げる問題が解決しますが、これは私とOPが実現したかったことです。
Daniel Douglas 14

8
@Domから借用して、getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);この値をプログラムで設定できます
Bron Davies

1
これは、他の回答(ジェリービーン4.1)とは異なり、私にとっては機能します
Virus721

パーフェクト!私の場合も機能しています。内部にedittextがあるダイアログを表示しています。ダイアログが開くとすぐに、キーボードも表示されていました。「adjustPan」を試しましたが、キーボード表示機能がブロックされました。したがって、私の場合は「adjustNothing」の方が効果的でした。
sembozdemir 2016年

85

私の場合、ボタンが押し上げられたのは、ボタンの上のビューがだったためで、設定したScrollView値に関係なく、ボタンがキーボードの上に押し上げられたときにボタンが折りたたまれましたandroid:windowSoftInputMode

ボタンのandroid:isScrollContainer="false"上にあるScrollViewを設定することで、ボタンの下の列がソフトキーボードによって押し上げられるのを回避できました。


2
しかし、この場合、ソフトキーボードは画面の一部を覆い、下にスクロールする方法がありません。キーボードの上部に下部パネルが表示されないようにする唯一の方法があるようです
Dmitry

1
これだよ!私が思うに、この設定は非常に興味深いものです。「adjustNothing」の欠落したプロパティの効果を達成するために私が見つけた唯一の方法です。
2013

私はそれをTextview Working great tnxで使用します
Sunil Chaudhary

2
@Artem Russakovskiiあなたが誰なのかはわかりませんが、この解決策であなたを愛しています。どうもありがとう。
Lev

1
@Artem Russakovskiiこれは完璧に動作します。どうもありがとう。
SkypeDogg

72

この属性を動的に追加onCreateするには、アクティビティのメソッドに次のコードを追加します。

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

これは私にとってはうまくいきましたが、それは:

android:windowSoftInputMode="adjustPan"

しませんでした。


android:windowSoftInputMode="adjustPan"AndroidManifest.xmlにを追加しましたか?
Habeeb Perwad 2014

いいえ、それは私にとって実際には何の違いもありませんでした。コードの最初の行は仕事をしました。:) @HabeebPerwad
Dom

AndoidManifest.xmlファイルにseconds行を追加しました。その後はそれだけでうまくいったと思います。ちょうど尋ねました。
Habeeb Perwad 2014年

1
@Dom、getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);フラグメントで" " を使用する方法?
Tushar Gogna 14

1
最終的に!これでうまくいきます!コントローラ(からの拡張FragmentActivity)とそれに接続されたいくつかのビュー(ビューはから拡張RelativeLayout)がありました。だから私はcontroller.getWindow()...あなたが言ったように厄介な見解でした。作品
Alaa M.

39

ここでのこれらの答えは私を助けませんでした。だから私はこれを試しました:

android:windowSoftInputMode="adjustResize"

これは魅力のように機能しましたが、私のアプリのヘッダーは消えません。その滑らかさ。


これはほぼ完璧に機能します。唯一の問題は、キーボードの提案バー/行がまだレイアウトを隠していることです。あなたはそのような問題に直面しましたか?
スーフィアン

私はこの問題に直面していません。@Sufian
amalBit

当時は何の問題もありませんでした。今はわかりません。@Sufian
amalBit

同様の問題に直面する可能性がある人にとっては、それはおそらく原因でしたTabLayout。可視性をに設定すると、問題はなくなりましたView.GONE。レイアウトを再設計するときかもしれません。
スーフィアン2018

13

これをプログラムでフラグメントで行うには、次のコードを使用できます

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

これをonResume()に配置します


11

将来の読者のために。

私はこの問題を具体的に制御したかったので、これは私がやったことです:

フラグメントまたはアクティビティから、他のビュー(キーボードが上にある間は不要なビュー)を非表示にし、それら復元してこの問題を解決します。

            rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    Rect r = new Rect();
                    rootView.getWindowVisibleDisplayFrame(r);
                    int heightDiff = rootView.getRootView().getHeight() - (r.bottom - r.top);

                    if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
                    //ok now we know the keyboard is up...
                        view_one.setVisibility(View.GONE);
                        view_two.setVisibility(View.GONE);

                    }else{
                    //ok now we know the keyboard is down...
                        view_one.setVisibility(View.VISIBLE);
                        view_two.setVisibility(View.VISIBLE);

                    }
                }
            });

1
@Skynetあなたは絶対に正しいです!これは、自分の問題に使用したカスタムソリューションでした。
Petro

7
ねえ、これは素晴らしかった。ただし、キーボードが閉じているインスタンスでは、ビューが表示に切り替わるまでに少し(ミリ秒)かかります。したがって、可視性を直接設定する代わりにview.post(Runnable runnable)、そこから可視性を使用して設定しました。それは私にとって素晴らしいことでした
daisura99 '09 / 09/21

9

追加する1行だけ...

android:windowSoftInputMode="stateHidden|adjustPan"必要なアクティビティを追加しますmanifest file

私は解決しました:) :)


8

xamarinユーザーの場合、このコードをMainActivityクラスのActivity属性に追加します。

WindowSoftInputMode =Android.Views.SoftInput.AdjustNothing

または、このコードWindow.SetSoftInputMode(Android.Views.SoftInput.AdjustNothing)をMainActivityクラスのOnCreateメソッドに追加できます。


8

これは私のために働いた

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

7

これまでのところ、ボタンとtextInputフィールド(並べて表示)がキーボードによって非表示にされ続けているため、回答は役に立ちませんでしたが、これで問題が解決しました。

android:windowSoftInputMode="adjustResize"

7

次のコードをマニフェストファイルの「アクティビティ」に追加します。

android:windowSoftInputMode="adjustResize"

これはうまくいきます。ただし、アドバイスとしては、パーセントを使用するとうまく機能しません。一部の要素を再調整するためです。したがって、パーセントのあるConstraints要素がある場合、問題が発生します。代わりにwrap_contentを使用してください。
チアゴシルバ


6

これは私のために働いた最高でした

android:windowSoftInputMode="adjustNothing"

それを試してみてください!


4

さて、これらの回答を見てきましたが、私の場合は同じ問題に陥り、非常に小さな無害な属性をxmlファイルにあるScrollviewタグに配置することを含む非常に便利で簡単な解決策を回避しました。あれは

android:isScrollContainer="false"

幸運を!



2

スクロールビューの場合:

android:windowSoftInputMode="stateHidden|adjustPan"Androidマニフェストを追加した後も動作しない場合。

キーボードが表示されるとスクロールビューになり、ボタン/オブジェクトがスクロールビューにない場合、オブジェクトはキーボードに追従してその位置を移動するため、影響を受ける可能性があります。

ボタンがある場所のxmlを確認し、それがスクロールビューブラケットの下にあり、外にないことを確認してください。

これがお役に立てば幸いです。:D


2

私の場合、キーボードを非表示にしておく必要があり、ボタンをクリックした直後にレイアウトを調整する必要があるため、このコマンドをマニフェストに追加するだけで非常に正しくなりました。

android:windowSoftInputMode="stateHidden|adjustResize"

2

キーボードを開いたときにビューを非表示にする場合。

これをマニフェストファイルのアクティビティに追加します

android:windowSoftInputMode="stateHidden|adjustPan"

2

それらのどれも私のために働いていません、これを試してください

 private void scrollingWhileKeyboard() {
    drawerlayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {

            Rect r = new Rect();
            try {
                drawerlayout.getWindowVisibleDisplayFrame(r);
                int screenHeight = drawerlayout.getRootView().getHeight();
                int keypadHeight = screenHeight - r.bottom;
                if (keypadHeight > screenHeight * 0.15) {
                    tabLayout.setVisibility(View.GONE);
                } else {
                    tabLayout.setVisibility(View.VISIBLE);
                }
            } catch (NullPointerException e) {

            }
        }
    });

}

1

アクティビティのメインウィンドウは、ソフトキーボード用のスペースを確保するためにサイズ変更されません。むしろ、ウィンドウのコンテンツは自動的にパンされるため、現在のフォーカスがキーボードによって隠されることがなく、ユーザーは入力内容を常に確認できます。

android:windowSoftInputMode="adjustPan"

これはあなたが望むもののためのより良い解決策かもしれません。



1

このコードはあなたを助けるかもしれません。oncreateメソッドで使用してください。

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

私はこれを試しましたが、ビューがビューの下部の一部を切り取り、ビューを押して上の時間をオーバーレイするという問題がありますか?どのレイアウトが変更されるか、または何が必要かに関するアイデアはありますか?stackoverflow.com/questions/39909897/...
Lion789

1

表示するアクティビティの下のマニフェストファイルに含めます。ただし、フルスクリーンアクティビティを使用しないようにしてください。

android:windowSoftInputMode="adjustPan"


1

追加して問題を解決しました

 android:windowSoftInputMode="adjustNothing" 

マニフェストファイルに追加します。

また、Recyclerviews制約isScrollContainerをfalseに設定します。

android:isScrollContainer="false"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.