뷰 이벤트의 경우
액티비티의 화면은 여러 뷰로 화면을 구성합니다. 이런 뷰들의 이벤트들은 터치 이벤트들을 사용하지 않고 각각의 뷰들에 제공하는 이벤트들을 사용합니다. 이러는 이유는 여러 뷰들이 있는 경우 어디를 터치했는지 어떠한 뷰인지 등 여러 가지 요소들을 생각해봐야 할 때가 많습니다. 이렇게 되면 프로그래밍이 많이 복잡해지기 때문에 각각의 뷰에서 제공하는 이벤트들을 사용하는 것이 좋습니다.
터치이벤트와 키 이벤트 같은 경우 콜백 함수로 처리를 하였지만 뷰 이벤트는 콜백 함수로는 부족합니다. 뷰 이벤트 처리는 이벤트 소스와 이벤트 핸들러로 역할이 나뉘며 이 둘을 리스너로 연결해야 이벤트를 처리할 수 있습니다.
- 이벤트 소스: 이벤트가 발생한 객체
- 이벤트 핸들러: 이벤트 발생 시 실행할 로직이 구현된 객체
- 리스너: 이벤트 소스와 이벤트 핸들러를 연결해 주는 함수
binding.checkbox.setOnCheckedChangeListener(object: CompoundButton.OnCheckedChangeListener{
override fun onCheckedChanged(p0: CompoundButton?, p1: Boolean) {
Log.d("tag","msg")
}
})
위 소스처럼 인터패이스를 구현한 object클래스를 이벤트 핸들러로 만들었지만 다른 방법으로도 구현할 수 있습니다.
- 액티비티에서 인터페이스를 구현하는 방법
- 이벤트 핸들러를 별도의 클래스로 만드는 방법
- SAM 기법으로 구현하는 방법
* SAM(single abstract method)이란 코틀린 코드에서 자바 인터페이스를 간단하게 사용하기 위해 제공하는 기법입니다.
// 액티비티에서 인터페이스를 구현하는 방법
class MainActivity : AppCompatActivity(), CompoundButton.OnCheckedChangeListener {
override fun onCreate(savedInstanceState: Bundle?) {
super .onCreate(savedInstanceState)
val binding = ActivityMain3Binding.inflate(layoutInflater)
setContentView(binding. root)
binding. checkbox. setOnCheckedChangetistener(this)
}
override fun onCheckedChanged(p0: CompoundButton?, p1: Boolean) {
Log.d("tag","msg")
}
}
// 이벤트 핸들러를 별도의 클래스로 만드는 방법
class MyEventHandler : CompoundButton.OnCheckedChangeListener {
override fun onCheckedChanged(p1: CompoundButton?, pl: Boolean) {
Log.d("tag","msg")
}
}
class MainActivity3 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMain3Binding.inflate(layoutInflater)
setContentView(binding.root)
binding.checkbox.setOnCheckedChangeListener(MyEventHandler())
}
}
// SAM 기법으로 구현하는 방법
class MainActivity3 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMain3Binding.inflate(layoutInflater)
setContentView(binding.root)
binding.checkbox.setOnCheckedChangeListener {
compoundButton, b -> Log.d("kkang”, “MAYA 221")
}
}
}
뷰에서 제공하는 이벤트들은 뷰가 아무리 다양하다고 해도 이벤트 처리 구조는 같습니다. 클릭 이벤트는 크게 보면 짧게 클릭하는 발생하는 ClickEvent와 길게 클릭할때 발생하는 LongClickEvent로 나뉩니다.ClickEvent, LongClickEvent는 뷰의 최상위 클래스인 View에 정의된 이벤트들입니다.
open fun setOnClickListener(l: View.OnClickListener?): Unit
open fun setOnLongClickListener(l: View.OnLongClickListener?): Unit
binding .button.setOnClickListener {
Log.d("tag","msg")
}
binding.button.setOnLongClickListener {
Log.d("tag","msg")
true
}