2016-05-13 10 views
9
setOnEditorActionListener

Also ich diesen Java-Code haben:Wie mit Kotlin

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
     if (actionId == EditorInfo.IME_ACTION_DONE) { 
      doSomething(); 
      return true; 
     } 
     return false; 
    } 
}); 

Ich habe es geschafft, dies zu bekommen (was ich bin nicht einmal sicher, ob es der richtige Weg ist):

editText.setOnEditorActionListener() { v, actionId, event -> 
     if(actionId == EditorInfo.IME_ACTION_DONE){ 
      doSomething() 
     } else { 
     } 
} 

Aber ich bekomme einen Fehler Error:(26, 8) Type mismatch: inferred type is kotlin.Unit but kotlin.Boolean was expected

Also wie ist ein solcher Event-Handler in Kotlin geschrieben?

+0

ja, das gleiche Ergebnis – Pier

Antwort

19

Die onEditorAction gibt eine zurück, während Ihr Kotlin Lambda Unit zurückgibt. Ändern Sie ihn auf das heißt:

editText.setOnEditorActionListener() { v, actionId, event -> 
     if(actionId == EditorInfo.IME_ACTION_DONE){ 
      doSomething() 
      true 
     } else { 
      false 
     } 
} 

The documentation auf Lambda-Ausdrücke und anonyme Funktionen gut zu lesen ist.

+1

willst du mir bitte sagen '{v, actionId, event ->' welches Thema ist das? – sushildlh

+0

@sushildlh da gehst du. – miensol

+0

danke ........... Ist eine Bibliothek, die wir im Android implementieren müssen? – sushildlh

0

Kotlin würde mit groß sein, wenn Schlüsselwort statt wenn sonst

Für mich mit dem folgenden Code mehr recht ist:

editText.setOnEditorActionListener() { v, actionId, event -> 
    when(actionId)){ 
     EditorInfo.IME_ACTION_DONE -> doSomething(); true 
     else -> false 
    } 
} 

p/s: Der Code von @Pier funktioniert nicht, weil ein Ausdruck auf der rechten Seite von Lambda erforderlich ist. Also müssen wir true/false anstelle von return true/false verwenden