Kotlin和H5通讯的两种方式
第一种:
在h5中调用kotlin的方法:使用flask起一个简单的web项目,在项目中添加一个按钮,并加入js代码
然后在kotlin中创建一个类:
- package com.example.mykotlinh5
- import android.content.Context
- import android.webkit.JavascriptInterface
- import android.widget.Toast
- // Kotlin与H5通讯的桥梁类
- class JsMethods(context:Context) {
- // 上下们对象
- private var mContext = context
- @JavascriptInterface // 安卓4.2之后都要加
- fun shouToast(json:String) {
- // 第一种方式弹出
- Toast.makeText(mContext, json, Toast.LENGTH_SHORT).show()
- }
- }
在main Activity中:
- package com.example.mykotlinh5
- import android.annotation.SuppressLint
- import androidx.appcompat.app.AppCompatActivity
- import android.os.Bundle
- import android.webkit.WebChromeClient
- import android.webkit.WebView
- import android.webkit.WebViewClient
- import kotlinx.android.synthetic.main.activity_main.*
- import org.json.JSONObject
- class MainActivity : AppCompatActivity() {
- // 懒加载:使用的时候才初始化
- private val mWebView:WebView by lazy {
- web_v
- }
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_main)
- // 使用anko快速找到id,并设置里面的值
- // 开启kotlin与h5通讯的开关
- mWebView.settings.javaScriptEnabled = true
- // 设置两个webViewClient
- mWebView.webViewClient = MyWebViewClient()
- mWebView.webChromeClient = MyWebChromeClient()
- //H5与Kotlin桥梁类通讯的桥梁类:第一个参数是被调用方法的对象,第二个参数是对象别名
- mWebView.addJavascriptInterface(JsMethods(this), "jsInterface")
- //
- mWebView.loadUrl("http://192.168.1.23:5000/")
- }
- // 创建两个WebViewClient
- private inner class MyWebViewClient : WebViewClient() {
- // 当页面加载完成调用的方法
- override fun onPageFinished(view: WebView?, url: String?) {
- super.onPageFinished(view, url)
- // 调用H5的方法:Kotlin调用h5方法规范:mWebView.loadUrl("javascript:方法名(参数)")
- var json = JSONObject()
- json.put("name", "我是Kotlin传给H5的方法")
- val jsString = json.toString()
- mWebView.loadUrl("""javascript:showMessage($jsString)""")
- }
- }
- // lambda表达式
- // 创建一个ChromeClient
- private class MyWebChromeClient : WebChromeClient() {
- // 控制加载的进度条
- override fun onProgressChanged(view: WebView?, newProgress: Int) {
- super.onProgressChanged(view, newProgress)
- }
- }
- }
然后就可以在页面中调用到了: