むあーるの雑記

Back

キーボードが表示されない#

画面を開いたタイミングでキーボードを表示したいと思い下記を参考にキーボードを表示しようとした 入力方法の表示の処理  |  Android デベロッパー  |  Android Developers

しかし、onResumeのタイミングででキーボードを表示しようとしても、表示されたりされなかったり不安定な現象が出た。

ボタンをタップしてキーボードを表示しようとすると キーボードが確実に表示されたので、 どうやらタイミングが悪いらしいというのはわかった。

たとえば、下記のようにonResumeからdelayさせると動作するようになるが、対症療法な感じになってしまう。

    view.postDelayed({
      showSoftInput()
    }, 100)
kotlin

そこでもう少し原因を探ってみた。

キーボードが確実に表示されるようにする#

結論としては、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)
        }
    }
kotlin

まとめ#

キーボードを表示したい場合はEditTextへのフォーカスだけでなく、その画面のWindowFocusも必要だった。

今回検証に使用したコードは下記にあります。 GitHub - muaaru/testKeyboard

Androidで画面が開かれると同時にキーボードを表示したい場合の実装
https://note.muaaru.com/blog/2021-07-25-post-509
Author muaaru
Published at 2021年7月25日