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.editText
は com.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)