안드로이드 키보드 바깥영역 클릭시 키보드 숨기기
SI 회사에 신입으로 들어온지 8개월이 지났다.
회사에서 일을 하게되면서 혼자 공부할 때는 몰랐던 여러가지를 경험하게된다.
그 중에 하나가 바로 오늘 다룰 주제이다.
안드로이드에서는 EditText를 클릭하게되면 키보드가 올라온다.
그런데 이 놈의 키보드가 아래 빨간동그라미친 "내리기버튼"을 누르지 않으면 내려가질 않는다.
키보드가 액티비티에서 띄워진 경우와 프래그먼트에서 띄워진 경우가 있다.
1. 액티비티에서 키보드 바깥영역 클릭시 키보드 내리기
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
val view = currentFocus
if (ev?.action == MotionEvent.ACTION_DOWN && view is EditText) {
val outRect = Rect()
.also { view.getGlobalVisibleRect(it) }
if (!outRect.contains(ev.rawX.toInt(), ev.rawY.toInt())) {
view.clearFocus()
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(view.windowToken, 0)
}
}
return super.dispatchTouchEvent(ev)
}
Activity에서 dispatchTouchEvent를 override해준다.
dispatchTouchEvent는 말그대로 사용자의 터치 이벤트를 내가 원하는 뷰에 전달해주는 함수이다.
함수 내용을 분석하자면,
val view = currentFocus
if (ev?.action == MotionEvent.ACTION_DOWN && view is EditText) {
터치 이벤트가 발생했을 때, 현재의 포커스가 EditText로 잡혀있다면,
if (!outRect.contains(ev.rawX.toInt(), ev.rawY.toInt())) {
터치한 부분의 영역이 키보드 외부인지를 판단한다.
view.clearFocus()
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(view.windowToken, 0)
키보드 외부 영역을 터치했다면, EditText의 포커스를 삭제하고 키보드를 내려준다.
dispatchTouchEvent를 BaseActivity에 구현하여 필요할 때 사용한다.
2. 프래그먼트에서 키보드 바깥영역 클릭시 키보드 내리기
fun hideKeyboard(){
if(activity != null && requireActivity().currentFocus != null){
val inputManager = requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputManager.hideSoftInputFromWindow(requireActivity().currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}
}
내용은 별거 없다.
함수 이름 그대로 키보드를 숨기는 hideKeyboard() 함수이다.
이 녀석을 프래그먼트(전체화면)을 클릭했을 때 실행해준다.
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
Log.d(TAG, "onViewCreated")
binding.root.setOnClickListener {
hideKeyboard()
}
}
이렇게하면 키보드 바깥 부분을 클릭시 키보드가 숨겨진다.
나 같은 경우에는 BaseFragment에 hideKeyboard() 함수를 정의해놓고 필요할 때 사용한다.