2015-11-24 4 views
7

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

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

ответ

6

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

В качестве обходного пути, вы можете использовать анонимный объект вместо лямбда-SAM-преобразуется в функциональный интерфейс Java OnGlobalLayoutListener:

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

Есть ли причина, по которой я продолжаю получать эту ошибку после обновления версии kotlin: 'Ошибка: исключение при анализе выражения в (84,13) в ...: java.lang.IllegalStateException: @NotNull метод org/jetbrains /kotlin/descriptors/impl/FunctionDescriptorImpl.getTypeParameters не должны возвращать null'. – shem

1

Другим решением является implement и использовать самореференцию:

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 свойство используется.

Смежные вопросы