2017-05-26 22 views
5

Web sayfam var. Bu yöntemKotlin, Java geri arama arabirimini kullan

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

'u çağırmak istiyorum.

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

benim KOTLIN kodu edilir:

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

Herkes KOTLIN içinde onReceiveValue yöntemi geçersiz kılmak için fikir sahibi Burada

ValueCallback arayüzüdür? Ben "KOTLIN için Java dönüştür" denedik ama sonuç yanındadır:

v.evaluateJavascript("e") { } 

teşekkürler! Bir Java arabirimi tek yöntem olan her

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

, Kotlin bu arabirimi uygulayan bir nesne yerine bir lambda geçmesine izin verir:

cevap

6

şu çizgi bir SAM conversion olarak adlandırılır. lamda evaluateJavascript fonksiyonunun son parametre olduğundan

, Java KOTLIN dönüşüm ne yaptığını parantez süresi dışında taşıyabilirsiniz:

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

Çok teşekkür ederim! İyi çalışıyor – vihkat

4

Zaten bulunmaktadır. Parantezleriniz arasındaki içerik onReceive işlevinin içeriğidir. Kotlin, Java'dan SAM dönüşümleri için otomatik işleme sahiptir. Aşağıdakilerin tümü eşdeğerdir.

// 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

İlk ikisinde bu yakın parantez ')' pozisyonlarından emin misiniz? – weston

+3

Evet, bu bir Kotlin özelliği. Dokümanlardan: "Kotlin'de, bir işlevin son parametresi bir işlevse ve bir lambda ifadesini karşılık gelen argüman olarak geçirirseniz, bunu parantezlerin dışında belirtebilirsiniz:" https: // kotlinlang.org/docs/reference/lambdas.html –

+1

Bu hoş. Harika bir cevap. – weston