[Android]/[Kotlin]
람다 활용 개념 / 람다 팁 / 리스너 구현
Hevton
2023. 1. 12. 12:48
반응형
RatingBar의 리스너 ( OnRatingBarChangeListener )
interface OnRatingBarChangeListener {
abstract fun onRatingChanged(
ratingBar: RatingBar!,
rating: Float,
fromUser: Boolean ): Unit
}
이렇게 구현체가 하나의 메서드만 override 하면 되는 경우 람다를 이용하여 간단하게 구현하여 사용할 수 있다.
binding.ratingBar.setOnRatingBarChangeListener { ratingBar, rating, fromUser -> }
또한 만약에 구현해야하는 메서드의 인자까지 하나라면, 람다에서는 인자 표현 생략도 가능하고, 해당 인자를 it으로 참조하면 된다.
binding.something.addListener{ print(it.text) }
위는 없는 코드이지만, 예시이다.
SeekBar의 리스너 ( OnSeekBarChangeListener )
interface OnSeekBarChangeListener {
abstract fun onProgressChanged(
seekBar: SeekBar!,
progress: Int,
fromUser: Boolean ): Unit
abstract fun onStartTrackingTouch(seekBar: SeekBar!): Unit
abstract fun onStopTrackingTouch(seekBar: SeekBar!): Unit
}
하지만 이렇게 구현체가 세 개의 메서드를 오버라이드 해야 한다면
binding.seekBar.setOnSeekBarChangeListener(object: SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(p0: SeekBar?, p1: Int, p2: Boolean) {
TODO("Not yet implemented")
}
override fun onStartTrackingTouch(p0: SeekBar?) {
TODO("Not yet implemented")
}
override fun onStopTrackingTouch(p0: SeekBar?) {
TODO("Not yet implemented")
}
})
람다가 아니라 직접 작성해 주어야 한다.
구현해야하는 함수가 몇개냐에 따라 다른 것이다.
하지만 구현해야하는 메서드가 여러개일지라도, 그 중에서 꼭 잘 쓰이는게 있을 거고, 잘 안 쓰이는게 있을 수 있다.
매번 여러개를 다 구현해놓는 것도 불편하고 낭비일 수 있다.
TextWatcher 같은 경우에는 구현해야 하는 메서드가 총 3개이지만, 하나의 메서드가 자주 쓰이기 때문에
람다를 이용해서, afterTextChanged() 만 구현하는 방법도 제공한다.
interface TextWatcher {
abstract fun afterTextChanged(s: Editable!): Unit
abstract fun beforeTextChanged(
s: CharSequence!,
start: Int,
count: Int,
after: Int ): Unit
abstract fun onTextChanged(
s: CharSequence!,
start: Int,
before: Int,
count: Int ): Unit
}
View의 OnClickListener
구현하는 함수도 하나, 인자도 하나이다. 따라서 람다로 구현하고, 인자도 생략하여 it으로 사용할 수 있다.
interface OnClickListener {
abstract fun onClick(v: View!): Unit
}
틀린 지식이 있다면 피드백 부탁드립니다.
반응형