¿Cómo hacer referencia a un lambda desde dentro?

Estoy intentando conseguir la altura de una visión en el método del onCreate pero no pude encontrar ninguna manera de quitar OnGlobalLayoutListener.

En Java (trabajando):

containerLayout.getViewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { containerLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this); int width = layout.getMeasuredWidth(); int height = layout.getMeasuredHeight(); } }); 

En Kotlin (no aceptar "esto"):

  containerLayout.viewTreeObserver.addOnGlobalLayoutListener { containerLayout.viewTreeObserver.removeOnGlobalLayoutListener(this) Toast.makeText(applicationContext, "size is "+ containerLayout.height,Toast.LENGTH_LONG).show() } 

¿Hay alguna referencia o ejemplo para este problema? Gracias.

No se admite hacer referencia a un lambda desde el interior.

Como solución, puede utilizar un objeto anónimo en lugar de lambda SAM-convertido a interfaz funcional Java OnGlobalLayoutListener :

 containerLayout.viewTreeObserver.addOnGlobalLayoutListener(object: OnGlobalLayoutListener { override fun onGlobalLayout() { // your code here. `this` should work } }) 

Otra solución es implementar y utilizar la autorreferencia:

 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 } 

Entonces el uso sería

 containerLayout.viewTreeObserver.addOnGlobalLayoutListener(selfReference { OnGlobalLayoutListener { containerLayout.viewTreeObserver.removeOnGlobalLayoutListener(self) // ... } } 

En lugar de this , se usa self propiedad self .

  • Variable 'runnable' debe ser inicializado
  • Error: Error en la ejecución de la tarea ': app: clean'. No se puede eliminar el archivo
  • Retrofit2 + SimpleXML en Kotlin: MethodException: La anotación debe marcar un método set o get
  • Kotlin y ArgumentCaptor - IllegalStateException
  • Constructores en Kotlin
  • Persistencia de la habitación: Error: Entidades y Pojos deben tener un constructor público utilizable
  • ¿Cómo acceder a "Activity.this" en Kotlin?
  • ¿Cómo puedo anular un método java, y cambiar la capacidad de anulación de un parámetro?
  • Referencia sin resolver DaggerApplicationComponent
  • Kotlin: Iterate a través de un JSONArray
  • Kotlin: ¿Cómo obtener y establecer un texto en TextView en Android usando Kotlin?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.