如何从里面引用lambda?
我想在onCreate方法获取视图的高度,但我找不到任何方法来删除OnGlobalLayoutListener。
在Java(工作)中:
containerLayout.getViewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { containerLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this); int width = layout.getMeasuredWidth(); int height = layout.getMeasuredHeight(); } });
在Kotlin(不接受“这个”):
containerLayout.viewTreeObserver.addOnGlobalLayoutListener { containerLayout.viewTreeObserver.removeOnGlobalLayoutListener(this) Toast.makeText(applicationContext, "size is "+ containerLayout.height,Toast.LENGTH_LONG).show() }
有没有这个问题的参考或例子? 谢谢。
从里面引用lambda不受支持。
作为一个解决方法,您可以使用匿名对象而不是lambda SAM转换为Java函数接口OnGlobalLayoutListener
:
containerLayout.viewTreeObserver.addOnGlobalLayoutListener(object: OnGlobalLayoutListener { override fun onGlobalLayout() { // your code here. `this` should work } })
另一个解决方案是实现和使用自引用:
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 }
那么用法就是了
containerLayout.viewTreeObserver.addOnGlobalLayoutListener(selfReference { OnGlobalLayoutListener { containerLayout.viewTreeObserver.removeOnGlobalLayoutListener(self) // ... } }
而不是this
,使用self
财产。