如何从里面引用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() } 

有没有这个问题的参考或例子? 谢谢。

Solutions Collecting From Web of "如何从里面引用lambda?"

从里面引用lambda不受支持。

作为一种解决方法,您可以使用匿名对象而不是使用lambda SAM转换为Java函数接口OnGlobalLayoutListener

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

另一个解决scheme是实现和使用自引用:

 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财产。