프로그래밍/Android

[안드로이드] Kotlin에서 addOnGlobalLayoutListener 사용하기 (lambda에서 자신을 참조하는 법)

Lou Park 2021. 5. 26. 03:13

Kotlin Lambda에서 this 참조가 제대로 걸리지 않아서 (지원하지 않는다고 ) addOnGlobalLayoutListener 일회성으로 사용하기가 어려웠다.

 

이렇게 적어서 구현하고 싶었지만...방황하는 this...

view.viewTreeObserver.addOnGlobalLayoutListener {
    // TODO...
    view.viewTreeObserver.removeOnGlobalLayoutListener(this)
}

 

SelfReference를 추가하여 구현하면된다. 

class SelfReference<T>(val initializer: SelfReference<T>.() -> T) {
    val self: T by lazy {
        inner ?: throw IllegalStateException()
    }

    private val inner = initializer()
}

fun <T> selfReference(initializer: SelfReference<T>.() -> T): T {
    return SelfReference(initializer).self
}
view.viewTreeObserver.addOnGlobalLayoutListener(selfReference {
    OnGlobalLayoutListener {
        // TODO...
        view.viewTreeObserver.removeOnGlobalLayoutListener(self)
    }
})

 

출처: https://stackoverflow.com/questions/35100389/writing-a-kotlin-util-function-which-provides-self-reference-in-initializer