¿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):
- Referencia no resuelta para Dagger 2 en Kotlin
- Leer CSV línea por línea en Kotlin
- Referencia sin resolver: kotlinx - Kotlin 1-0-0-rc-1036
- WeakReference no funciona en Kotlin
- La propiedad debe ser inicializada o ser abstracta
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.
- Kotlin android proguard error
- Kotlin genéricos herencia dolor de cabeza
- El constructor de vista personalizada en Android 4.4 se bloquea en Kotlin, ¿cómo arreglarlo?
- "No se puede encontrar la clase referenciada" con Proguard y Kotlin
- Android Studio 3.0 Los cambios de Kotlin no se reflejan en la compilación
- Android Studio 3.0 Canary 1: Las pruebas de Kotlin o las pruebas de Java referentes a las clases de Kotlin fallan
- Suprimir "Identificador no permitido en Android"
- Archivo Kotlin vs Clase. ¿Cual es la diferencia?
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
.
- ¿Cómo agregar anuncios en la vista de reciclador en la posición 2 en android?
- Android – reproducir sonido diferente en cada segundo clic