Androidで画面が開かれると同時にキーボードを表示したい場合の実装
キーボードが表示されない
画面を開いたタイミングでキーボードを表示したいと思い下記を参考にキーボードを表示しようとした
入力方法の表示の処理 | Android デベロッパー | Android Developers
しかし、onResumeのタイミングででキーボードを表示しようとしても、表示されたりされなかったり不安定な現象が出た。
ボタンをタップしてキーボードを表示しようとすると
キーボードが確実に表示されたので、
どうやらタイミングが悪いらしいというのはわかった。
たとえば、下記のようにonResumeからdelayさせると動作するようになるが、対症療法な感じになってしまう。
view.postDelayed({
showSoftInput()
}, 100)
そこでもう少し原因を探ってみた。
キーボードが確実に表示されるようにする
結論としては、ViewのFocusだけでなく、その画面がWindowのFocusを取得している必要があるためということのようだ。
確かにデバッグログを出してみるとonResumeのあとにonWindowFocusChangedが呼び出される。
なので、onResumeのタイミングではまだWindowのFocusが取得できていない。
そのためonWindowFocusChangedでWindowのFocusが取得できてから、キーボードを表示することで確実に表示できるようになった
override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
Log.d("DEBUG" , "onWindowFocusChanged hasFocus : $hasFocus")
if(hasFocus) {
binding.editText.setSelection(selectionStart,selectionEnd)
showSoftInput(binding.editText)
}
}
まとめ
キーボードを表示したい場合はEditTextへのフォーカスだけでなく、その画面のWindowFocusも必要だった。
今回検証に使用したコードは下記にあります。
GitHub – muaaru/testKeyboard