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

Я пытаюсь получить высоту представления в методе 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 .

Intereting Posts
Обменный код между модульными испытаниями и контрольно-измерительными тестами при использовании котлина RxJava2 + Завершить черный экран при запросе данных Как сохранить имя пользователя и пароль из моего приложения в мою базу данных и как подключить мое приложение к моей базе данных? filterNotNull в списке Kotlin с общим типом Выполнение не выполнено для задачи «app: copyDebugAndroidTestKotlinClasses» – Android Kotlin Build Error Как конвертировать список в карту в Котлин? Как класс макета может не соответствовать его классу java в Котлине? Запуск модульных тестов не вызывает изменений Kotlin zipВсе альтернатива Класс Kotlin не получает свое булево значение от firebase Постоянство помещения: ошибка: сущности и Pojos должны иметь полезный публичный конструктор Kotlin – функции расширения и типы платформ? воспроизведение любого встроенного видео в веб-браузере в Android с намерением Что означает сигнатура функции Kotlin с T. ()? Обновление для поддержки 27 и SDK 27 из 25, авария на Android 4.4 сейчас