ソフトキーボード表示でレイアウトを上に移動させない方法 | How to keep the layout with soft keyboard display | Android

スポンサーリンク

何も設定しない状態では以下のいずれかの表示をシステムが選択します。

システムが自動で設定を行いますから、何もしない場合はレイアウト状況によってどちらかが選択されます。これは望ましい状態とは言えません。そのため、設定をおこないます。JAVAでもレイアウトXMLでもなく、Manifestの設定です。

スポンサーリンク

Manifest設定

<activity>においてwindowSoftInputMode属性を指定します。

adjustResize adjustPan

レイアウトを崩さないためにはwindowSoftInputModeにadjustPanを指定します。

<activity android:name=".MainActivity"
    android:screenOrientation="portrait"
    android:windowSoftInputMode="adjustPan"/>

AndroidDeveloperサイトに掲載されていますが、まとめますと

説明
stateUnspecified デフォルト設定。システムが適切な状態を選択。
stateUnchanged アクティビティがフォアグラウンドに移動したとき、ソフト キーボードは非表示 / 表示にかかわらず前回の状態を維持します。
stateHidden ユーザーがアクティビティを選択したとき、つまり、ユーザーが別のアクティビティから離れて戻ったのではなく、そのアクティビティを選んで移動したとき、ソフト キーボードは非表示になります。
stateAlwaysHidden アクティビティのメイン ウィンドウに入力のフォーカスがあるとき、ソフト キーボードは常に非表示になります。
stateVisible 一般的に適切なタイミングで(ユーザーがアクティビティのメイン ウィンドウを選んで移動したとき)ソフト キーボードが表示されます。
stateAlwaysVisible ユーザーがアクティビティを選択したとき、つまり、ユーザーが別のアクティビティから離れて戻ったのではなく、そのアクティビティを選んで移動したとき、ソフト キーボードは表示されます。
adjustUnspecified アクティビティのメイン ウィンドウのサイズを変更してソフト キーボードのスペースを確保するか、画面上で現在のフォーカスを表示できるようにウィンドウのコンテンツをパンニングするか、指定されていません。 システムは、ウィンドウのコンテンツにコンテンツをスクロールできるレイアウト ビューが存在するかどうかに応じて、これらのモードのうちいずれかを自動的に選択します。 このようなビューが存在する場合、スクロールによってウィンドウのすべてのコンテンツを小さい領域でも表示できると見なされ、ウィンドウのサイズが変更されます。

これはメイン ウィンドウの動作設定のデフォルトです。

adjustResize 画面上のソフト キーボードのスペースを確保するためにアクティビティのメイン ウィンドウは常にサイズが変更されます。
adjustPan 画面上のソフト キーボードのスペースを確保するためにアクティビティのメイン ウィンドウのサイズは変更されません。 代わりにウィンドウのコンテンツは自動的にパンニングされ、現在のフォーカスがキーボードで隠されることがないため、ユーザーは入力中の内容を常に見ることができます。 一般にこの方法はサイズ変更に比べると望ましくありません。ユーザーがソフト キーボードを閉じて、ウィンドウの隠れた部分を操作する必要が生じる可能性があるためです。

複数を指定する場合は | で区切る。

android:windowSoftInputMode="adjustPan|stateUnchanged"

のように。

この方法でも無理な場合

もし、この方法でも無理な場合はapplicationタグ内に

android:fitsSystemWindows="true"

を追加してください。

その他

EditTextに初期状態でフォーカスを当てない方法は以下。

EditTextに初期状態でフォーカスさせない方法 | How to not focus on EditText | Android
フォーカスの設定 ActivityにEditTextを設定すると初期状態では上画像のように最上位のEditTextにフォーカスが当たります。さらに、機種などによってはソフトキーボードが表示されます。 この動きが望ましくない場合、以下のようなXMLを親に追加します。 仕組みとしてはEditViewの親にあたるレイアウトV...