Android(Kotlin) DialogFragment 表示時にソフトキーボードも表示

September 24, 2020

はじめに

DialogFragment でのソフトキーボード表示処理にハマったので備忘録です。

詳細

やりたいこと

ダイアログ表示直後に、ダイアログ内に存在する入力可能領域にフォーカスし、ソフトキーボードも表示する。

初期実装

まず、ドキュメントを参考に下記の通り実装しましたが、該当入力可能領域にフォーカスするものの、ソフトキーボードが表示されません。

val imm = requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
if (binding.editText.requestFocus()) {
    imm.showSoftInput(binding.editText, InputMethodManager.SHOW_FORCED)
}

上記は DialogFragment を継承したクラスの onCreateDialog() メソッド内で実行しています。 また、binding は自動生成されたバインディングクラスのインスタンスであり、binding.editTextcom.google.android.material.textfield.TextInputEditText のインスタンスです。

ログを確認すると、下記の気になるメッセージが・・・。

W/InputMethodManager: The current service view is not the focus view

showSoftInput() メソッドのリファレンスを読む限り、フォーカスされている View を引数として渡さないといけない所、上記のメッセージの通りフォーカスと判定されていないため、動かないのではないかと推測します。

最終的な実装

結局、toggleSoftInput() メソッドを使って解決しました。

val imm = requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
if (binding.editText.requestFocus()) {
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)
}

本質的な解決にはなっておらず、ソフトキーボードが非表示でなければいけない前提が追加されちゃいますが、 現段階ではこれしか解決策が見つかりませんでした・・・。

おまけ

ソフトキーボードを非表示時にしたい場合は下記です。

imm.hideSoftInputFromWindow(binding.root.windowToken, 0)

Product

「いつやるかは決めてないけれど、必ずやらなければいけないタスク」を忘れないためのアプリ