2017-05-26 34 views
5

Mam WebView. Chcę nazwaćKotlin używa interfejsu wywołania zwrotnego Java

public void evaluateJavascript(String script, ValueCallback<String> resultCallback) 

tej metody.

Oto interfejs ValueCallback:

public interface ValueCallback<T> { 
    /** 
    * Invoked when the value is available. 
    * @param value The value. 
    */ 
    public void onReceiveValue(T value); 
}; 

Tu jest mój kod Kotlin:

webView.evaluateJavascript("a", ValueCallback<String> { 
      // cant override function 
     }) 

Ktoś ma pomysł, aby zastąpić onReceiveValue metodę w Kotlin? Próbowałem "Convert Java do Kotlin", ale wynik jest następny:

v.evaluateJavascript("e") { } 

Dzięki!

Odpowiedz

6

Poniższy wiersz jest nazywany SAM conversion:

v.evaluateJavascript("e", { value -> 
    // Execute onReceiveValue's code 
}) 

Ilekroć interfejs Java ma jednej metody, Kotlin pozwala przechodzić w lambda zamiast obiektu, który implementuje ten interfejs.

Ponieważ lambda jest ostatni parametr funkcji evaluateJavascript, można go przenieść poza nawiasami, czyli to, co Java do Kotlin konwersja zrobił:

v.evaluateJavascript("e") { value -> 
    // Execute onReceiveValue's code 
} 
+0

Dziękuję bardzo! Działa dobrze – vihkat

4

Już są. Zawartość między nawiasami klamrowymi jest zawartością funkcji onReceive. Kotlin ma automatyczną obsługę konwersji SAM z Java. Wszystkie poniższe są równoważne.

// Use Kotlin's SAM conversion 
webView.evaluateJavascript("a") { 
    println(it) // "it" is the implicit argument passed in to this function 
} 

// Use Kotlin's SAM conversion with explicit variable name 
webView.evaluateJavascript("a") { value -> 
    println(value) 
} 

// Specify SAM conversion explicitly 
webView.evalueateJavascript("a", ValueCallback<String>() { 
    println(it) 
}) 

// Use an anonymous class 
webView.evalueateJavascript("a", object : ValueCallback<String>() { 
    override fun onReceiveValue(value: String) { 
     println(value) 
    } 
}) 
+0

Czy jesteś pewien co do tych pozycji '' 'w pierwszych dwóch nawiasach? – weston

+3

Tak, to cecha Kotlina. Z dokumentów: "W Kotlin istnieje konwencja, że ​​jeśli ostatnim parametrem funkcji jest funkcja, a przekazujesz wyrażenie lambda jako odpowiedni argument, możesz określić go poza nawiasami:" https: // kotlinlang.org/docs/reference/lambdas.html –

+1

To miło. Świetna, dokładna odpowiedź. – weston