#はじめに
Androidアプリ開発(Kotlin)で学んだ内容を備忘録として残します!
どのような機能か?
場面
- フォーム(EditText)にフォーカスが当たっている
- 入力用キーボードが表示されている
動作
上記の状態で背景画面をタップするとキーボードを閉じる
というもの
実装
Activity
MainActivity.kt
// ~ 省略 ~
// Viewがタッチされる時に処理が走るメソッド
override fun onTouchEvent(event: MotionEvent?): Boolean {
// InputMethodManager をキャストしながら取得
val inputMethodManager: InputMethodManager =
getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
// エルビス演算子でViewを取得できなければ return false
// focusViewには入力しようとしているのEditTextが取得されるはず
val focusView = currentFocus ?: return false
// このメソッドでキーボードを閉じる
inputMethodManager.hideSoftInputFromWindow(
focusView.windowToken,
InputMethodManager.HIDE_NOT_ALWAYS
)
return false
}
これだけ。
ちなみに
キーボードを閉じるメソッドはInputMethodManagerクラス
ではこのように定義されている。
InputMethodManager.java
public boolean hideSoftInputFromWindow(IBinder windowToken, int flags) {
return hideSoftInputFromWindow(windowToken, flags, null);
}
共通化したらこんな形になりそう(おまけ)
共通化ファイル
objectで定義
KeyboardUtils.kt
object KeyboardUtils {
fun hideKeyboard(focusView: View) {
val inputMethodManager: InputMethodManager =
focusView.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(
focusView.windowToken,
InputMethodManager.HIDE_NOT_ALWAYS
)
}
}
Activity
Activityで呼ぶ
MainActivity.kt
// ~ 省略 ~
override fun onTouchEvent(event: MotionEvent?): Boolean {
val focusView = currentFocus ?: return false
KeyboardUtils.hideKeyboard(focusView)
return false
}
補足
Activity
に実装していれば、関連するFragment
でも同様に動作するためFragment
には実装の必要なし
スペシャルサンクス(参考にさせていただいた資料)
- https://developer.android.com/reference/android/view/inputmethod/InputMethodManager
- http://blog.lciel.jp/blog/2013/12/03/android-touch-event/
最後に
簡単な短い記事でしたが、誤り、ご指摘などあればコメントいただければ幸いです!
ありがとうございました!!