kako.dev

開発、自作アプリのこと

EditTextからカーソルが外れたらキーボードを隠す

EditTextってキーボードが隠れないですよね。 普通、以下のような動作に時にはキーボードが自動で隠れてほしいものです。

  • エンターを押した  - 何ならアクションもしたい
  • EditTextからカーソルが外れた
  • 画面から離れた

そんな時のために以下のようなクラスを作りました。

クラス

class EditTextHelper(val view: EditText) {

    init {
        setOffCursolHideKeyboard()
    }

    fun setOnKeyListener(lister: (v: View, keyCode: Int, event: KeyEvent) -> Unit) {
        view.setOnKeyListener { v, keyCode, event ->
            lister(v, keyCode, event)
            if (isEnterAction(keyCode, event)) offCursolHideKeyboard()
            false
        }
    }

    // キーボードでエンターキー押した時
    fun isEnterAction(keyCode: Int, event: KeyEvent): Boolean = (keyCode == KeyEvent.KEYCODE_ENTER && event.action == KeyEvent.ACTION_UP)

    // キーボードを閉じる
    fun offCursolHideKeyboard() {
        val inputMethodManager: InputMethodManager = view.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        inputMethodManager.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
    }

    // カーソルが外れた時
    fun setOffCursolHideKeyboard() {
        view.setOnFocusChangeListener { v, hasFocus ->
            if (!hasFocus) offCursolHideKeyboard()
        }
    }
}

使い方

val editTextHelper = EditTextHelper(R.id.editText)
// エンター押した時にアクションを起こしたい場合
editTextHelper.setOnKeyListener { v, keyCode, event ->
    if (editTextHelper.isEnterAction(keyCode, event)) {
        Log.d("editTextHelper", "isEnterAction")
    }
    false
}

これでキーボードが自動で隠れてくれます。