概要
チャット風アプリを作っていると 「何もないところタップしたらキーボードに閉じる」 という挙動を入れたくなります。そのための方法を2つ考えてみたので紹介します。
方法1
「何もないところ」は具体的にいうとキーボードや EditText
部分以外の RecyclerView
の領域になります。なので、素直にRecyclerView
のアイテムに対してクリックリスナーをセットしてその中でキーボードを閉じるコードを書いてあげればよさそうです。
groupieAdapter.setOnItemClickListener { _, _ ->
hideKeyboard()
}
方法2
もう1つは 「フォーカス」 を利用する方法です。 EditText
以外の View にフォーカスが移動したらキーボードを閉じるという作戦です。
editText.onFocusChanged { gainFocus, _, _ ->
if(!gainFocus) {
hideKeyboard()
}
}
フォーカスについての詳しいことは 公式ドキュメント https://developer.android.com/guide/topics/ui/ui-events.html](https://developer.android.com/guide/topics/ui/ui-events.html を参照のこと。
あとは RecyclerView
のアイテムの layout ファイルに以下を追記して、アイテムがフォーカスを取得できるようにします。
++ android:focusable="true"
++ android:focusableInTouchMode="true"
方法2は 例えば ダイアログやボトムシートを開いた時にキーボードを閉じたいといった場合にも応用が効きやすいという点で優れていると言えそうです。任意の View にフォーカス可能性を設定しておきさえすれば、その View にフォーカスが移動した時にキーボードが閉じてくれるからです。