4

I have following extension method. How can I reference the OnGlobalLayoutListener that is passed into the addOnGLobalLayoutListener() method? I need to pass the listener to the removeOnGlobalLayoutListener() method.

fun View.OnGlobalLayout(callback:() -> Unit ): Unit{
    this.viewTreeObserver.addOnGlobalLayoutListener {
        if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
            this.viewTreeObserver.removeOnGlobalLayoutListener(this);
        }
        else {
            this.viewTreeObserver.removeGlobalOnLayoutListener(this);
        }
        callback();
    }
}
Marcin Koziński
  • 10,835
  • 3
  • 47
  • 61
jellyfication
  • 1,595
  • 1
  • 16
  • 37
  • 1
    See also http://stackoverflow.com/questions/38074356/kotlin-recommended-way-of-unregistering-a-listener-with-a-sam – yole Jun 29 '16 at 14:53

1 Answers1

6

One way is to use object expression instead of lambda like so:

fun View.OnGlobalLayout(callback: () -> Unit): Unit {
    val viewTreeObserver = this.viewTreeObserver
    viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
        override fun onGlobalLayout() {
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
                viewTreeObserver.removeOnGlobalLayoutListener(this);
            } else {
                viewTreeObserver.removeGlobalOnLayoutListener(this);
            }
            callback();
        }
    })
}
miensol
  • 39,733
  • 7
  • 116
  • 112