7

我有一个 Web 视图。我想打电话

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

这是我的科特林代码:

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

有人知道在 kotlin 中重写 onReceiveValue 方法吗?我尝试了“将 Java 转换为 Kotlin”,但结果如下:

v.evaluateJavascript("e") {  }

谢谢!

4

2 回答 2

12

以下行称为SAM 转换

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

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

由于 lambda 是evaluateJavascript函数的最后一个参数,您可以将其移到括号外,这就是 Java 到 Kotlin 的转换所做的:

v.evaluateJavascript("e") { value ->
  // Execute onReceiveValue's code
}
于 2017-05-26T18:43:38.123 回答
7

你已经是了。大括号之间的内容是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)
    }
})
于 2017-05-26T18:45:06.813 回答