Development record of developer who study hard everyday.

, , , , ,

안드로이드 키보드 바깥영역 클릭시 키보드 내리기

안드로이드 키보드 바깥영역 클릭시 키보드 숨기기

안드로이드 개발 블로그

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() 함수를 정의해놓고 필요할 때 사용한다.


Share:

댓글 없음:

댓글 쓰기