Kotlin与H5通信方式(h5调用kt kt调用h5 cal

2019-08-09  本文已影响0人  JaosnZhao

一 : 主类

class MainActivity : AppCompatActivity() {

/**

    * 懒加载

    */

    private val mWebView:WebViewby lazy{

        m_WebView

}

    override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

//1.开启Kotlin与H5通信的开关

      setWebView()

}

//lamada

//    var add = {a:int,b:int -> a+b}

    var setWebView ={

        m_WebView.settings.javaScriptEnabled =true

        //2.设置两个Client

        m_WebView.webViewClient = MyWebviewClient()

m_WebView.webChromeClient = MyWebChromeClient()

//kotlin与H5通信开关

        //设置桥梁类

        //对象.方法名  对象的别名

        //H5调用kotlin

        m_WebView.addJavascriptInterface(JavaScriptMethods(this,m_WebView),"jsInterface")

m_WebView.loadUrl("file:///android_asset/javascript.html")

}

    inner private class MyWebviewClient :WebViewClient(){

override fun onPageFinished(view: WebView?, url: String?) {

super.onPageFinished(view, url)

//kotlin主动调用H5

//            m_WebView.loadUrl("javascript:方法名(参数)")

            var json = JSONObject()

json.put("name","kotlin")

m_WebView.loadUrl("javascript:message( " + json.toString() +")")

}

}

private class MyWebChromeClient :WebChromeClient(){

//控制加载进度条

        override fun onProgressChanged(view: WebView?, newProgress: Int) {

super.onProgressChanged(view, newProgress)

}

}

}

二:桥梁

class JavaScriptMethods {

private var mContent:Context? =null

    private var mWebview:WebView? =null

    constructor(mContent: Context?,webview:WebView?) {

this.mContent = mContent

this.mWebview = webview

}

@JavascriptInterface//17 4.2上能调

    fun showTip(json:String){

Toast.makeText(mContent,json,Toast.LENGTH_LONG).show()

}

@JavascriptInterface

    fun getStorDate(json:String){

var isJson = JSONObject(json)

//http://dev.yuedaowang.com/driverapp/v2/getParameterList

        val callback = isJson.opt("callback")

println("获取酒店数据")

//异步操作在子线程操作

        doAsync {

            var url = URL("http://dev.yuedaowang.com/driverapp/v2/getParameterList")

//流变成字符串

            val readText = url.readText()

println(readText)

//回传数据

//            mWebview!!.

            mContent?.let {

                it.runOnUiThread {

                    mWebview?.let {

                        it.loadUrl("javascript:" + callback +"(" + readText +")")

}

}

}

}

    }

}

三 :模拟的H5页面

<!DOCTYPE html>

        <meta charset="UTF-8">

        <title>first

          function callAndroid(){

console.log("点击啦")

var json = {"name":"html5"}

jsInterface.showTip(JSON.stringify(json))

}

var message = function(json){

alert(JSON.stringify(json))

}

function callkotlin(){

console.log("callback")

var json = {"callback":"receiveHotelDate"}

//调用kotlin方法

                jsInterface.getStorDate(JSON.stringify(json))

}

var receiveHotelDate = function(json){

alert(JSON.stringify(json))

}

        <button id="btn1" onclick="callAndroid()">js调用kotlin方法

        <button id="btn2" onclick="callkotlin()">js调用kotlin方法(calllback)

</html>

四 :附带图

上一篇下一篇

猜你喜欢

热点阅读