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