Как обратиться к лямбда изнутри?

Я пытаюсь получить высоту представления в методе onCreate, но я не смог найти способ удалить OnGlobalLayoutListener.

В Java (рабочий):

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

В Котлине (не принимаем «это»):

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

Есть ли ссылка или пример для этой проблемы? Благодарю.

Ссылка на лямбду изнутри не поддерживается.

В качестве обходного пути вы можете использовать анонимный объект вместо 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 .