ソフトウェアキーボードが非表示になったら画面が崩れる
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ってことにする。