Androidで背景を押して、キーボードをを非表示にできないとかなり不便ですよね?
キーボードの下に入力欄があったりすると入力できないですし。
戻るボタンを毎回押すのは大変だと思い、背景を押すと、キーボードを非表示にする処理を入れようと思います。
ただ、いろいろ調べていてもなかなかしっくりくるものがなくうーんと思っていたら、しっくりくる方法がありました。
手順は2つあります。
####①フォーカスされるViewの作成
まずはViewの作成です。
作成するViewは背景をタップしたときにフォーカスされるViewです。
フォーカスされるとキーボードの表示がなくなるので、そのためのものです。
<TextView
android:id="@+id/focusView"
android:layout_width="0dp"
android:layout_height="0dp"
android:focusable="true"
android:focusableInTouchMode="true"
app:layout_constraintBottom_toTopOf="parent"
app:layout_constraintEnd_toStartOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
実際に画面に表示はしないので、幅・高さは0dpにします。
そして、focusable="true"を設定します。
####②入力欄以外を押したときの処理を追加
フォーカスが変わったときの処理を追加します。
フォーカスが変わった時なので、フォーカスが合った時と外れたとき同様に通る処理になります。
titleEdit.setOnFocusChangeListener { v, hasFocus ->
if (!hasFocus) {
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(v.windowToken, 0)
}
}
hasFocusがfalseのとき、つまり、フォーカスが外れたときにキーボードを非表示にする処理になります。
上記の手順で、キーボードが非表示になりました。
他に調べた方法だと、フォーカスが当たった時と外れたとき別々に処理を記載する等ありましたが、これが一番しっくりきました。
また、dispatchTouchEventで行うという方法もありましたが、他の入力欄がタップできなかったり、ソースコードが多くなったりとあり、見送りました。
他にいい方法があれば、教えていただきたいです。