2017-05-26 37 views
5

我有一个WebView。我想致电Kotlin使用Java回调接口

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

任何人有想法,覆盖科特林的onReceiveValue方法? 我尝试了“转换Java来科特林”,但结果是下一个:

v.evaluateJavascript("e") { } 

谢谢!

回答

6

下面的行被称为SAM conversion

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

每当一个Java接口有一个方法,科特林允许在一个拉姆达传实现该接口的对象,而不是。

因为拉姆达是evaluateJavascript函数的最后一个参数,您可以在括号,这是Java到科特林转换做了什么以外的移动它:

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

非常感谢!效果不错 – vihkat

4

你已经是。大括号之间的内容是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) 
    } 
}) 
+0

你确定关于前两个那些“'''''位置吗? – weston

+3

是的,这是Kotlin的一个特色。从文档:“在Kotlin中,有一个约定,如果函数的最后一个参数是一个函数,并且您将一个lambda表达式作为相应的参数传递,则可以在括号外指定它:”https:// kotlinlang.org/docs/reference/lambdas.html –

+1

很好。非常彻底的答案。 – weston