뷰를 사용자가 터치했을 때 터치 이벤트를 사용하지 않고 뷰 이벤트를 사용한다. 터치 이벤트를 사용할 경우 사용자가 터치한 뷰가 어느 뷰인지 좌푯값으로 판단해야하기 때문에 너무 복잡하기 때문이다.
터치 이벤트와 키 이벤트와는 달리, 뷰 이벤트는 콜백 함수만 선언해서는 처리할 수 없다. 뷰 이벤트는 이벤트 소스(event source)와 이벤트 핸들러(event handler)로 역할이 나뉘고, 이 둘을 리스너(listener)로 연결해야 이벤트를 처리할 수 있다.
아래 코드는 id가 checkbox1 인 체크 박스가 체크 상태로 변경될 때 이벤트 처리 함수이다. 여기서 이벤트 소스는 checkbox1 객체이고, setOnCheckedChangeListener가 리스너이다. 이벤트 핸들러는 OnCheckedChangeListener 인터페이스를 구현한 object 클래스이다.
binding.checkbox1.setOnCheckedChangeListener(object: CompoundButton.OnCheckedChangeListener{
override fun onCheckedChanged(p0: CompoundButton?, p1: Boolean) {
Log.d("kkang", "체크박스 클릭")
}
})
액티비티 자체에서 인터페이스를 구현하는 방법이다.
class MainActivity : AppCompatActivity(), CompoundButton.OnCheckedChangeListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
var binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.checkbox1.setOnCheckedChangeListener(this)
}
override fun onCheckedChanged(p0: CompoundButton?, p1: Boolean) {
Log.d("kkang", "체크박스1 클릭")
}
}
이벤트 핸들러를 별도의 클래스로 만들어 처리하는 방법이다.
class MyEventHandler : CompoundButton.OnCheckedChangeListener {
override fun onCheckedChanged(p0: CompoundButton?, p1: Boolean) {
Log.d("kkang", "체크박스1 클릭")
}
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
var binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.checkbox1.setOnCheckedChangeListener(MyEventHandler())
}
}
코틀린의 SAM 기법을 이용하는 방법이다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
var binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.checkbox1.setOnCheckedChangeListener{
compoundButton, b ->
Log.d("kkang", "체크박스1 클릭")
}
}
}
SAM(Single Abstract Method)란? 코틀린에서 자바 인터페이스를 간단하게 사용하기 위해 제공하는 기법이다.
클릭 이벤트와 롱클릭 이벤트는 뷰의 최상위 클래스인 View 에 정의된 이벤트이다.
binding.button1.setOnClickListener{
Log.d("kkang", "button1 클릭 이벤트")
}
binding.button1.setOnLongClickListener{
Log.d("kkang", "button1 롱클릭 이벤트")
true
}
LongClickEvent 의 콜백 함수는 아래처럼 정의되어 있다.
abstract fun onLongClick(v: View!):Boolean
반환값이 Boolean 이기 때문에 이벤트 콜백 함수의 맨 마지막 줄에 true나 false를 리턴해주어야 한다.