为了方便原生开发和Html之间数据传递,在静态页面的情况下可以改变原生开发的页面;
实现
新建一个Activity,布局里面放一个WebView
布局
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".web.WebActivity">
<Button
android:id="@+id/js_Btn"
android:layout_width="match_parent"
android:text="调用js方法"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_height="wrap_content"/>
<WebView
android:id="@+id/webView"
android:layout_width="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@id/js_Btn"
android:layout_height="0dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>
Activity
class WebActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_web)
var webView = findViewById<WebView>(R.id.webView)
//开启javaScript
webView.settings.javaScriptEnabled = true
//添加js接口
webView.addJavascriptInterface(this , "web")
webView.loadUrl("file:///android_asset/web/index.html")
var string = "WebActivity数据"
findViewById<Button>(R.id.js_Btn).setOnClickListener {
//原生调用js方法
webView.loadUrl("javascript:alertInfo('${string}' , 123)")
}
}
//js调用原生方法
@JavascriptInterface
fun startWelcomeActivity(string: String , int: Int){
Log.i("startWelcomeActivity" , "string:${string} int:${int}")
startActivity(Intent(this , WelcomeActivity::class.java))
}
}
**html文件**
<!DOCTYPE html>
<html>
<script type="text/javascript">
function startWelPage(str){
<!-- 这里的web是addJavascriptInterface里的第二个参数 -->
window.web.startWelcomeActivity(str , 123);
};
function alertInfo(str , int){
document.getElementById("dianji").innerHTML = str + int;
};
</script>
<body>
<a id="dianji" href="javascript:startWelPage('webjs数据')">点击这里</a>
</body>
</html>
将html文件放入项目本地
完成!
通过 webView.loadUrl(“javascript:alertInfo()”)去调用js的方法
如果是安卓4.4版本以上,可以用这个方法去调用js
evaluateJavascript这个方法可以拿到返回值。可以添加一个ValueCallback
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
webview.evaluateJavascript("javascript:" + jsName + "(" + value.toString() + ")", callback);
} else {
webview.oadUrl("javascript:" + jsName + "(" + value.toString() + ");");
}
通过在函数上面添加@JavascriptInterface提供h5的接口
记得开启这两个
//开启javaScript
webView.settings.javaScriptEnabled = true
//添加js接口
webView.addJavascriptInterface(this , “web”)
添加一个外部的js接口
webView.addJavascriptInterface(WebObject() , “web”)
需要注意的是,JavascriptInterface里面是默认在子线程调用的,使用的时候,记得使用 runOnUiThread {} , lifecycleScope.launch(Dispatchers.Main) {}去调用主线程的东西,比如说弹窗什么的