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将方法名传过来。(解耦)

kotlin学习笔记——kotlin与Js通信_第1张图片

4.贴上相关代码

(1) kotlinHtml.html




    
    
    









需要引用jquery:

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

你可能感兴趣的:(kotlin笔记)