1. 程式人生 > >kotlin學習筆記——kotlin與Js通訊

kotlin學習筆記——kotlin與Js通訊

和原來一樣,通過物件互相傳值。 webview傳遞物件給js呼叫,webview則通過

mWebview.loadUrl("javaScript:方法名(引數)")來呼叫js中的方法,需要注意的是呼叫js方法必須在主執行緒。

1.懶載入:使用時才初始化, 型別宣告為val

private val mWebview:WebView by lazy {
    webview
}

2. 當js需要java中的資料時,js調java方法,java再呼叫js中的方法將資料做為引數傳給js。

回撥js方法名,可以不寫死,由js將方法名傳過來。(解耦)

4.貼上相關程式碼

(1) kotlinHtml.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
                button{
                    width : 100%;
                    height:50px;
                    margin-top:20px
                }

    </style>
</head>

<body>
<button id="btn1">js呼叫kotlin方法</button>
<button id="btn2">kotlin呼叫js方法</button>

<script src="jquery-1.11.3.js"></script>
<script>
$("#btn1").on("click",function(){
    console.log("點選了");
    //呼叫kotlin方法
    var json = {"name":"html5"}
    window.jsInterface.showToast(JSON.stringify(json))
});

//H5 callback呼叫kotlin方法
$("#btn2").on("click",function(){
    //callback:1.呼叫kotlin方法
    var json = {"callback":"receiveHotelData"}
     window.jsInterface.getHotelData(Jsp);
});

var showMessage = function(json){
alert(JSON.stringify(json))
}

var receiveHotelData = function(json){
alert(JSON.stringify(json))
}
</script>
</body>
</html>

需要引用jquery:

<script src="jquery-1.11.3.js"></script>

(2)JavaScriptMethods

import android.content.Context
import android.webkit.JavascriptInterface
import android.webkit.WebView
import org.jetbrains.anko.doAsync
import org.jetbrains.anko.runOnUiThread
import org.jetbrains.anko.toast
import org.json.JSONObject
import java.net.URL

/**
 * H5與kotlin通訊的橋樑類
 * Created by Administrator on 2018/3/10.
 */
class JavaScriptMethods {
    private var mContext: Context? = null
    private var mWebView:WebView? = null

    constructor(mContext: Context?, mWebView: WebView?) {
        this.mContext = mContext
        this.mWebView = mWebView
    }

    @JavascriptInterface
    fun showToast(json: String) {
//        Toast.makeText(mContext,json,Toast.LENGTH_SHORT).show()
//        mContext?.toast(json)
        mContext?.let { it.toast(json) }
    }

    @JavascriptInterface
    fun getHotelData(json: String){
        val jsonObject = JSONObject(json)
        val callback = jsonObject.optJSONObject("callback")
        doAsync {
            var url = URL("http://www.jingbanyun.com")
//            變成字串
            val result = url.readText()
            var json = JSONObject()
            json.put("name",result)
            //呼叫js方法必須在主執行緒
            mContext?.let {
                it.runOnUiThread {
                    mWebView?.let {
                        it.loadUrl("javaScript:"+callback+"("+json+")")
                    }
                }
            }
        }
    }
}

(3)MainActivity

class MainActivity : AppCompatActivity() {

    //懶載入,使用時才初始化, 型別宣告為val
    private val mWebview:WebView by lazy {
        webview
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        setWebView()

    }

    //lambda表示式{引數->返回值}
//    var add = {a:Int,b:Int ->a+b}
    var setWebView = {
        //1.開啟Kotlin與H5通訊開關
        mWebview.settings.javaScriptEnabled = true
        //2.設定2個WebViewClient
        mWebview.webViewClient = MyWebViewClient()
        mWebview.webChromeClient = MyWebChromClient()

        //kotlin與H5通訊方式1:H5呼叫Kotlin方法
        //設定kotlin與H5的通訊橋樑類
        mWebview.addJavascriptInterface(JavaScriptMethods(this,mWebview),"jsInterface")

        //kotlin與H5通訊方式1:H5呼叫Kotlin方法
        //載入網頁
        mWebview.loadUrl("file:///android_asset/kotlinHtml.html")
    }

 inner  private class MyWebViewClient: WebViewClient(){
        override fun onPageFinished(view: WebView?, url: String?) {
            //頁面載入完成
            super.onPageFinished(view, url)
            //kotlin與H5通訊方式2:Kotlin呼叫H5方法
//            mWebview.loadUrl("javaScript:方法名(引數)")
            var json = JSONObject()
            json.put("name","Kotlin")
            mWebview.loadUrl("javaScript:showMessage("+json+")")
        }
    }

    private class MyWebChromClient : WebChromeClient(){
        //載入進度條
        override fun onProgressChanged(view: WebView?, newProgress: Int) {
            super.onProgressChanged(view, newProgress)
        }
    }
}