2017-05-26 54 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); 
}; 

は私kotlinコードです:

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

誰もがkotlinでonReceiveValueメソッドをオーバーライドするアイデアを持っていますか? 私は "KotlinへのJavaの変換" を試みたが、結果は次である:

v.evaluateJavascript("e") { } 

ありがとう!

答えて

6

次の行がSAM conversionと呼ばれて:Javaインタフェースは、単一のメソッドを持っているときはいつでも

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

、Kotlinは、あなたが代わりにそのインターフェイスを実装するオブジェクトのラムダに渡すことができます。

ラムダはevaluateJavascript関数の最後のパラメータであるので、あなたは、Java Kotlinへの変換が何をしたかである、括弧の外に移動することができます:

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

最初の2桁の '?' – weston

+3

はい、それはKotlinの機能です。ドキュメントから: "Kotlinには、関数の最後のパラメータが関数で、対応する引数としてラムダ式を渡している場合、カッコの外側で指定することができます。" https:// kotlinlang.org/docs/reference/lambdas.html –

+1

いいですね。素晴らしい徹底的な答え。 – weston

関連する問題