2015-11-24 12 views
7

Ich versuche, Höhe einer Ansicht in onCreate-Methode zu erhalten, aber ich konnte keine Möglichkeit finden, OnGlobalLayoutListener zu entfernen.Wie referenziere ich ein Lambda von innen?

In Java (in Betrieb):

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

    } 
}); 

In Kotlin (nicht "der" zu akzeptieren):

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

Gibt es eine Referenz oder ein Beispiel für dieses Problem? Vielen Dank.

Antwort

6

Die Referenzierung eines Lambda von innen wird nicht unterstützt.

Als Abhilfe können, können Sie anstelle von Lambda anonymes Objekt verwenden OnGlobalLayoutListener auf Java funktionale Schnittstelle SAM-konvertiert:

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

Gibt es einen Grund, warum ich diesen Fehler nach Update Kotlin Version bekomme: 'Fehler: Ausnahme beim Analysieren Ausdruck bei (84,13) in ...: java.lang.IllegalStateException: @NotNull Methode org/jetbrains /kotlin/descriptors/impl/FunctionDescriptorImpl.getTypeParameters darf nicht null zurückgeben – shem

1

Eine andere Lösung ist zu implement und verwenden Selbstreferenz:

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 
} 

Dann wäre die Verwendung

containerLayout.viewTreeObserver.addOnGlobalLayoutListener(selfReference { 
    OnGlobalLayoutListener { 
     containerLayout.viewTreeObserver.removeOnGlobalLayoutListener(self) 
     // ... 
    } 
} 

Anstelle von this wird self Eigenschaft verwendet.

Verwandte Themen