
Kotlinでキーボードを閉じる方法 の記事で、
サンプルアプリを作ってInputMethodManager の使い方を紹介しました。
記事を書いている中、サンプルアプリを作る過程で、
いくつか実装に詰まったポイントがあったので、この記事ではそんな裏側を紹介します!
同じ悩みにぶつかった人の助けになれれば嬉しいです。
case1.フォーカスがEditTextから移らない問題
EditTextからフォーカスが外れた時に、ソフトキーボードを閉じようとしましたが、
なかなかフォーカスが移らず、ここで手こずりました。
こちらの記事を参考にしながら、フォーカスを移す用の View を用意したのですが、
うまくフォーカスがうつってくれず。。TT
書いてある通り、タッチを検知した時に見えないViewへフォーカスを移すという実装をしたのですが、
試行錯誤を重ねてもうまくいきません。。
↓その時の様子

「onTouch()は通っているのにview.requestFocus()が効かない!」
「xmlで android:focusable=”true” android:focusableInTouchMode=”true” の設定もしてるのに!!」
騒ぎましたが、記事で紹介されていた見えないViewにフォーカスを当てるという作戦はうまくいかず、
結局
『Fragment全体に focusableInTouchMode=”true”を行った上で、
Fragment にフォーカスを当てる』
という手段で解決しました。
うまく行ったソースコードは⬇️こちらの記事⬇️に記載しています。
case2.キーボード閉じているのにEditTextにフォーカスが当たったまま問題
入力を行なってボタンをクリックしてキーボードは閉じた。
なのにEditTextにフォーカスは当たったままでチカチカしている。。。
ボタン押下を検知するonClick()内で、
InputMethodManager を使ってキーボードを閉じたのに、
フォーカスを他に移していないことが原因でした。

この問題は、
『フォーカスを他に移すとonFocusChangeが走ってその中のキーボードが閉じる処理が働く』
と気づいたので、view.request() を行うだけで解決しました。
キーボードは出ていないのに入力欄にはフォーカスが当たっている
機能バグには繋がりませんが、ユーザー目線になるとちょっと気持ち悪いです。。。

おわり
以上 Kotlinでキーボードを閉じる方法 の記事を書いている裏で、
詰まったところ、苦しんだところの紹介でした!
参考になればぜひ本編も見て欲しいです。
ご精読ありがとうございました!!
【InputMethodManager】Kotlinでキーボードを閉じる方法
ピンバック: 【InputMethodManager】Kotlinでキーボードを閉じる方法 | Memento Mori Blog