WebSettings 工具类提供了 setJavaScriptEnabled(true) 即可让 JavaScript 脚本来调用 Android;还提供了addJavascriptInterface(Object object, String name) 方法来暴露 Android 对象,该方法负责把 object 对象暴露成 JavaScript 中的 name 对象。点击 HTML 上面的 按钮:
package com.crazy.jscallandroid;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.webkit.WebSettings;
import android.webkit.WebView;
public class MainActivity extends AppCompatActivity {
WebView myWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
// setSupportActionBar(toolbar);
myWebView = (WebView)findViewById(R.id.webView);
// 此处加载 assets 目录下的 HTML 页面
myWebView.loadUrl("file:///android_asset/test.html");
// 获取 WebView 的设置对象
WebSettings webSettings = myWebView.getSettings();
// 让 JavaScript 脚本来调用 Android
webSettings.setJavaScriptEnabled(true);
// 将 ForJS 对象暴露给 JavaScript 脚本,以便在 test.html 页面中 JavaScript 可以通过 fjs 来调用
myWebView.addJavascriptInterface(new ForJS(this), "fjs");
}
}
package com.crazy.jscallandroid;
import android.content.Context;
import android.support.v7.app.AlertDialog;
import android.webkit.JavascriptInterface;
import android.widget.Toast;
public class ForJS {
Context mContext;
public ForJS(Context context) {
mContext = context;
}
@JavascriptInterface
public void showToast(String name){
Toast.makeText(mContext, name + ", 你好!", Toast.LENGTH_SHORT).show();
}
// 用 @JavascriptInterface 修饰,将该方法暴露给 JavaScript 脚本调用
@JavascriptInterface
public void showList(){
new AlertDialog.Builder(mContext)
.setTitle("中国")
.setIcon(R.drawable.ic_launcher)
.setItems(new String[]{"北京", "上海", "广州"},null)
.setPositiveButton("确定", null)
.create()
.show();
}
}
布局文件只是一个简单的 WebView 文件,此处不再给出。
assets中的 test.html 脚本如下:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title> Js调用Android的方法 </title>
</head>
<body>
<!-- 此处的fjs是Android暴露出来的对象 -->
<input type="button" value="打招呼"
οnclick="fjs.showToast('世界');" />
<input type="button" value="中国"
οnclick="fjs.showList();" />
</body>
</html>