今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

ソフトウェアキーボードが非表示になったら画面が崩れる

Activityで文字入力するときにDialogFragmentを表示して、その中で入力させるプログラムを作った。
Activity内の一部に画像を表示しているためなのか、DialogFragmentでソフトウェアキーボードを表示するまでは正常に動くけど、ソフトウェアキーボードが非表示になったときに画像が崩れるという現象が発生した。

再描画させればいいかと思ってぐぐってみたら、invalidate()を呼べば再描画してくれると書いてたのでやってみた。
invalidate()はViewのメソッドなので、Activityにはないから、getRootView().invalidate()してみた。

    @Override
    protected void onResume() {
        super.onResume();
        getRootView().invalidate();
    }

すると、ぬるぽが発生。。。
getRootView()がnullを返してるらしい。

インスタンス変数で保持している適当なViewに対してやってみた。

    @Override
    protected void onResume() {
        super.onResume();
        hogeView.getRootView().invalidate();
    }

しかし、再描画されない。

ソフトウェアキーボードに関連する問題だから、キーワードを変えて検索してみた。
android software keyboard close redraw」みたいな。
すると、こちらのページがヒット。

Android app does not refresh after soft-keyboard is hidden - Stack Overflow

ManifestのActivityの設定に、

        android:windowSoftInputMode="adjustPan"

または

        android:windowSoftInputMode="adjustNothing"

を書いてやればいいらしい。

で、なんとなく adjustNothing を書いたら表示が崩れないようにはなった。

でも、これってどんな設定?

<activity>  |  Android Developers

ドキュメントを見る限りでは adjustNothing なんてフラグないんですけど。。。

adjustPan は存在。ソフトウェアキーボードが表示された時に、デフォルトでは画面をリサイズしてソフトウェアキーボード分だけ画面が上にずれるけど、adjustPan を指定すればリサイズしなくなるらしい。

ドキュメントに存在しない adjustNothing を指定するのもどうかと思ったので、adjustPan を指定してみた。動作的には adjustNothing と同じ動きをしているように見えるし、表示も崩れることはないみたいなので、これでOKってことにする。