이벤트 처리는 사용자와 상호작용하기 위해 반드시 필요합니다. 모든 GUI Framework가 그렇듯이 안드로이드에서도 고유의 이벤트 처리 방법을 제공합니다.
크게 두 가지 방식으로 이벤트를 처리할 수 있습니다. 이벤트 종류에 따라 두 방식중 하나를 선택해야합니다.
- 이벤트 콜백 함수를 오버라이딩해서 처리하기
- 처리 로직을 담은 이벤트 리스너 등록하기
이벤트 콜백 함수 오버라이딩
Activity나 View에서 직접 이벤트 콜백 함수를 오버라이딩하여 이벤트를 처리할 수 있습니다. TouchEvent와 KeyEvent 등이 있습니다.
앞으로 나올 이벤트들을 보면 모두 Boolean타입을 리턴하고 있습니다. 이 값의 의미는 이벤트를 소모(consume)했는지 여부를 나타냅니다. 만약 true로 설정하면 시스템이 이 이벤트를 폐기하여, 다른 리스너에서 처리하지 못하도록 합니다. 특수한 경우가 아니라면 보통 super.onTouchEvent(event)와 같이 값 리턴을 부모 메서드에 위임합니다.
TouchEvent
사용자가 손가락으로 화면을 터치하면 발생하는 이벤트입니다. View에서 처리할 경우에는 View를 터치한 경우에 발생됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
override fun onTouchEvent(event: MotionEvent?): Boolean {
when (event?.action){
MotionEvent.ACTION_DOWN -> {
// 손가락으로 터치하기 시작했을 때
}
MotionEvent.ACTION_UP -> {
// 손가락을 땠을 때
}
MotionEvent.ACTION_MOVE -> {
// 터치한 채로 움직일 때
}
}
return super.onTouchEvent(event)
}
위와 같이 Activity나 View에 존재하는 onTouchEvent를 오버라이딩하여 처리합니다. 그리고 event 객체를 통해 각종 터치 관련 정보(터치 위치, 종류 등)들을 얻어올 수 있습니다.
- event.action: 어떤 터치 이벤트가 발생했는지 구분합니다. ACTION_DOWN, ACTION_UP, ACTION_MOVE가 있습니다.
- event.x: 상대적 x위치입니다.
- event.y: 상대적 y위치입니다.
- event.rawX: 화면상의(절대적) x위치입니다. Activity의 경우에는 x와 rawX와 차이가 없습니다. 하지만 View의 경우 View를 기준으로 터치한 위치를 x로 나타내고, 화면상의 x위치를 rawX로 나타냅니다.
- event.rawY: 화면상의(절대적) y위치입니다.
KeyEvent
키 이벤트는 안드로이드 폰의 키를 눌렀을 때 발생하는 이벤트입니다. 여기서 키는 볼륨조절, 전원, 홈, 뒤로가기 등의 물리적인 버튼을 의미합니다.
1
2
3
4
5
6
7
8
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
// 키를 누르기 시작했을 때
return super.onKeyDown(keyCode, event)
}
override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {
// 키를 땠을 때
return super.onKeyUp(keyCode, event)
}
keyCode는 KeyEvent.KEYCODE_BACK / KEYCODE_VOLUME_UP … 등과 같이 각종 버튼들 code가 넘어옵니다.
처리 로직을 담은 이벤트 리스너 등록하기
버튼, 체크박스, 이미지뷰 등 각종 뷰를 클릭했을 때의 이벤트를 처리해야하는 경우가 종종 생깁니다. 위의 이벤트 콜백 함수 오버라이딩을 활용하여 처리한다면, 각 뷰마다 onTouchEvent를 오버라이딩하여 사용해야합니다. 그러면 코드 구조가 상당히 복잡해집니다. 그래서 각 뷰에서 이벤트 처리 로직만을 ‘이벤트 헨들러’라는 것으로 받아서 처리하면, 더 간편하게 이벤트 처리를 할 수 있습니다.
좀 더 정확히는 ‘이벤트 핸들러’로 이벤트 처리하는 로직을 구현하고, 리스너를 통해서 뷰에 등록하면 됩니다. 그러면 뷰에서 이벤트가 발생했을 때, 리스너를 구현한 핸들러의 이벤트 함수가 호출되고, 결국 핸들러에서 이벤트를 처리하게 됩니다.
ClickEvent
뷰를 클릭하면 ClickEvent가 발생합니다.
1
2
3
button.setOnClickListener {
// button 클릭시 로직
}
위의 코드에서는 button에 ClickEvent를 처리하는 리스너를 등록하고 있습니다. 만약 View Binding을 사용한다면, button대신 binding.button과 같이 사용하면 됩니다.
위의 코드는 kotlin의 SAM을 활용해 간결하게 작성한 모습입니다. 원래는 아래와 같은 모습입니다.
1
2
3
4
5
button.setOnClickListener(object: View.OnClickListener) {
override fun onClick(view: View?){
// button 클릭시 로직
}
})
View.OnClickListener는 오직 하나의 함수 onClick만 구현하도록 하는 인터페이스입니다. 그래서 처음 봤던 코드처럼 SAM기법을 활용해 더 간결하게 줄일 수 있습니다.