08-2 뷰 이벤트
뷰 이벤트의 처리 구조
뷰 이벤트는 일정한 구조에 따라 처리됨
뷰 이벤트는 이벤트 콜백 함수만 서언해서는 처리할 수 없음
뷰 이벤트 처리는 이벤트 소스(event source)와 이벤트 핸들러(event handler)로 역할이 나뉘며
이 둘을 리스너(listener)로 연결해야 이벤트를 처리할 수 있음
- 이벤트 소스 : 이벤트가 발생한 객체
- 이벤트 핸들러 : 이벤트 발생 시 실행할 로직이 구현된 객체
- 리스너 : 이벤트 소스와 이벤트 핸들러를 연결해 주는 함수
즉, 이벤트 소스에 리스너로 이벤트 핸들러를 등록해 놓으면 이벤트가 발생할 때 실행되는 구조임
· 체크박스 이벤트 처리
대부분 이벤트 핸들러는 이름 형식이 OnXXXListener인 인터페이스를 구현해서 만듦
대표적으로 OnClickListener, OnLongClickListener, OnItemClickListener 등의 인터페이스 제공함
· 액티비티에서 인터페이스를 구현한 예
class MainActivity3 : AppCompatActivity(), CompoundButton.OnCheckedChangeListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMain3Binding.inflate(layoutflater)
setContentView(binding.root)
binding.checkbox.setOnCheckedChangeListener(this)
}
override fun onCheckedChanged(p0: CompoundButton?, p1: Boolean) {
Log.d("kkang", "체크박스 클릭")
}
}
· 이벤트 핸들러를 별도의 클래스로 만든 예
class MyEventHandler : CompoundButton.OnCheckedChangeListener {
override fun onCheckedChanged(p0: CompoundButton?, p1: Boolean) {
Log.d("kkang", "체크박스 클릭")
}
}
class MainActivity3 : AppCompatActivity(), CompoundButton.OnCheckedChangeListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMain3Binding.inflate(layoutflater)
setContentView(binding.root)
binding.checkbox.setOnCheckedChangeListener(MyEventHandler())
}
}
· SAM 기법으로 구현한 예
class MainActivity3 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMain3Binding.inflate(layoutflater)
setContentView(binding.root)
binding.checkbox.setOnCheckedChangeListener {
compoundButton, b ->
Log.d("kkang", "체크박스 클릭")
}
}
}
클릭과 롱클릭 이벤트 처리
ClickEvent
- 뷰를 짧게 클릭할 때 발생함
- 핸들러
- open fun setOnClickListener(l: View.OnClickListener?): Unit
LongClickEvent
- 뷰를 길게 클릭할 때 발생함
- 핸들러
- open fun setOnLongClickListener(l: View.OnLongClickListener?): Unit
ClickEvent, LongClickEvent는 뷰의 최상위 클래스인 View에 정의된 이벤트임
ClickEvent는 OnClickListener를 구현한 객체를 이벤트 핸들러로 등록해야 함
LongClickListener는 OnLongClickListener를 구현한 객체를 이벤트 핸들러로 등록해야 함
· 버튼의 클릭, 롱클릭 이벤트 처리
binding.button.setOnClickListener {
Log.d("kkang", "클릭 이벤트")
}
binding.button.setOnLongClickListener {
Log.d("kkang", "롱클릭 이벤트")
true
}
· 자바로 작성한 이벤트 핸들러
binding.btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
· 코틀린으로 작성한 이벤트 핸들러
binding.btn.setOnClickListener(object: View.OnClickListener {
override fun onClick(p0: View?) {
}
})
· SAM 기법을 이용한 이벤트 핸들러 구조
binding.btn.setOnClickListener {
(...생략...)
}
추상 함수 하나를 포함하는 인터페이스만 SAM 기법으로 이용할 수 있음
* SAM(single abstract method) : 코틀린 코드에서 자바 인터페이스를 간단하게 사용하기 위해 제공하는 기법
'Kotlin' 카테고리의 다른 글
[Kotlin / Android] 09. 리소스 활용하기 - 리소스의 종류와 특징 (1) | 2024.03.11 |
---|---|
[Kotlin / Android] 08. 사용자 이벤트 처리하기 - 시계 앱의 스톱워치 기능 만들기 (0) | 2024.03.09 |
[Kotlin / Android] 08. 사용자 이벤트 처리하기 - 터치와 키 이벤트 (0) | 2024.03.05 |