最近做Android项目时需要进行webview与html页面中的js进行交互,包括android调用js以及js调用android本地代码,现将代码整理记录下。
整个布局比较简单,就是的一个TextView加一个WebView
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
tools:context="com.example.demowebviewjs.MainActivity">
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="调用js方法"
android:textSize="35sp" />
<WebView
android:id="@+id/wb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"></WebView>
</LinearLayout>
由于我们加载的网页是在本地的,所以不需要任何权限,进行完控件的初始化后就加载页面,并设置成支持js
WebView wb = (WebView) findViewById(R.id.wb);
//设置编码
wb.getSettings().setDefaultTextEncodingName("utf-8");
//支持js
wb.getSettings().setJavaScriptEnabled(true);
//载入页面
wb.loadUrl("file:///android_asset/test.html");
android调用网页中的代码比较简单,只需要调用webview的loadUrl方法
wb.loadUrl("javascript:funFromjs()");
其中javascript是固定写法,冒号后面跟上页面中的方法名,如果方法中有参数的话只需要用单引号引用并且中间用逗号隔开,例如
wb.loadUrl("javascript:funFromjs('mUserName','mPsw')");
js调用安卓本地代码的话webview需要调用addJavascriptInterface这个方法
//设置本地调用对象及其接口
wb.addJavascriptInterface(new Object() {
@JavascriptInterface //sdk17版本以上加上注解
public void funFromAndroid(String name) {
Toast.makeText(MainActivity.this, name,Toast.LENGTH_LONG).show();
}
public void fun(String name) {
Toast.makeText(MainActivity.this, "调用fun2:" + name, Toast.LENGTH_SHORT).show();
}
}, "android");
可以看到其实就是两个参数,一个Object,一个String,其中Object中我们可以定义一些方法让js调用,不过需要注意的是如果SDK版本号高于17的话,如果希望js可以调用,那么需要在方法上加上@JavascriptInterface这个注解,后面的String就类似于对象名一样,最后加上js的代码
<!DOCTYPE html>
<html>
<head>
<meta chatset="utf-8" />
<title>This is a test</title>
</head>
<body>
<a>js中调用本地方法</a>
<script>
function funFromjs(){
document.getElementById("helloweb").innerHTML="HelloWebView,i'm from js";
}
var aTag = document.getElementsByTagName('a')[0];
aTag.addEventListener('click', function(){
//调用android本地方法
android.funFromAndroid("调用android本地方法funFromAndroid(String name)!!");
return false;
}, false);
</script>
<p></p>
<div id="helloweb">
</div>
</body>
</html>