〈kotlin〉入力後にキーボードを非表示

Android studioでkotlinを使ってAndroidアプリ作成の勉強中。

EditTextはフォーカスが当たるとキーボードが表示され、
入力後も表示されたままになり、手動で閉じる必要がある。
これを、入力後Enterキーを押すことで自動で閉じるように実装する。

キーボードを非表示にするメソッド
private fun handleKeyEvent(view: View, keyCode: Int): Boolean {
   if (keyCode == KeyEvent.KEYCODE_ENTER) {
       val inputMethodManager =
           getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
       inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
       return true
   }
   return false
}

キーボードには入力できるそれぞれのキーに対してキーコードが設定されている。
今回は押されたキーのキーコードがKeyEvent.KEYCODE_ENTERと一致している場合に、
非表示の処理が進むように条件分岐する。

InputMethodManagerはソフトキーボードの表示と非表示を制御するクラスで、
この中のhideSoftInputFromWindowでキーボードを非表示にできる。
hideSoftInputFromWindowはリクエストを行うウィンドウのトークンと、
非表示の設定フラグ(Int型)を引数に持つ。
フラグは通常0で良さそうだが、
InputMethodManager.HIDE_IMPLICIT_ONLY / HIDE_NOT_ALWAYS も指定できそう。
InputMethodManager  |  Android Developers

EditTextにキーリスナーを設定
override fun onCreate(savedInstanceState: Bundle?) {
   ...
   binding.editText.setOnKeyListener { 
       view, keyCode, _ -> handleKeyEvent(view, keyCode)
   }
}

EditTextにはOnKeyListenerインターフェースを渡し、
キーの押下が発生したときにトリガーされる onKey() メソッドを設定する。
onKey() メソッドは ビュー、押されたキーを表すコード、キーイベントの3つを受け取るので、
この中で最初に作ったhandleKeyEvent()メソッドを呼び出してビューとキーコードを渡す。


参考
より洗練されたユーザー エクスペリエンスを作成する  |  Android デベロッパー  |  Android Developers
InputMethodManager  |  Android Developers
View.OnKeyListener  |  Android Developers