ソフトキーボード表示時下部のレイアウトが押し上がる問題

Androidアプリ開発で困ったところをメモ。

RelativeLayoutで下部にボタンを配置したレイアウトでソフトキーボード表示をすると左画のように下部のボタンがソフトキーボードの上にきてしまいます。なぜ?

こちらの意図するところではないのでソフトキーボードの裏というかレイアウトは元通り右画のように固定してて欲しい!

これはEditTextを使用して設定画面を作った例です。

下部にボタンを配置して設定部分の上部は表示が入りきれなかった場合に備えてスクロールビューとしました。

どうやらこのケースでは適用したスクロールビューが悪さをしているみたいです。スクロールビューを外して実験したら押し上がらなかったので犯人確定ですね。

解決方法はレイアウトXMLのスクロールビューのところに下記の指定を入れるだけ。

android:isScrollContainer="false"

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@id/v_footer"
    android:isScrollContainer="false"
    >
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
    >

    </RelativeLayout>
</ScrollView>

isScrollContainerはソフトキーボードが表示されたときスペースを空けるためにViewをリサイズするかどうかの設定のようです。デフォルトがtrueのようでリサイズされていたってことですね。

スクロールビューではなくListViewを使用している場合でも同様の現象が起きます。

これもレイアウトXMLのListViewタグ内に
android:isScrollContainer="false"
を入れると解決できました。

最初、検索で見つかるadjustPanやfitsSystemWindowsやらを参考にさせて頂いたのですが適用しても全くダメで随分さまよいました(^^;

<おまけ>
もうひとつよく分からずあて勘で解決できた方法があります。

画面遷移した際に自動でソフトキーボードが表示されないようにjavaのコードに下記を入れるというのがあります。

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

ひょっとしたらこれに何かないかなぁと探していたらそれっぽいワードがあったので調べもせず適用してみました。

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

結果は押し上がらなくなりました。おー。

FLAG_KEEP_SCREEN_ONは画面の自動消灯をさせないようにする設定みたいですがこれで何故動作が変わる??
はい。よく分かりません(笑)

ソフトキーボードが表示されている間は画面の自動消灯が行われないことになるので入力中の寝落ちは無い(…ではよいのか?)。

だとしても私には理由が分からないのでお勧めはできませんけどねー。

なら勘でやるなって(^^; こんなバカなこともやってみた記録として残しておきます。