Kotlin使用Java回调接口

时间:2017-05-26 18:36:34

标签: kotlin kotlin-interop

我有一个WebView。我想打电话

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

这种方法。

这是ValueCallback接口:

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

这是我的kotlin代码:

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

有人想知道在kotlin中覆盖onReceiveValue方法吗? 我尝试了“将Java转换为Kotlin”,但结果是下一个:

v.evaluateJavascript("e") {  }

谢谢!

2 个答案:

答案 0 :(得分:7)

以下行称为SAM conversion

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

每当Java接口只有一个方法时,Kotlin允许您传入lambda而不是实现该接口的对象。

由于lambda是evaluateJavascript函数的最后一个参数,你可以将它移到括号之外,这就是Java to Kotlin转换的作用:

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

答案 1 :(得分:6)

你已经是。大括号之间的内容是onReceive函数的内容。 Kotlin自动处理来自Java的SAM转换。以下所有内容都是等效的。

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