[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
    
}

 

 

 

 

틀린 지식이 있다면 피드백 부탁드립니다.

반응형