Android - JS和Android互相调用以及传参
Android中使用WebView来与JavaScript交互。
JS调用Android中的方法:
1. 调用WebView关联的WebSettings的setJavaScriptEnabled(true)启用JS。
2. 调用WebView关联的addJavascriptInterface(Object object, String name)方法将object对象暴露给JS。
3. 在JavaScript脚本中通过刚才暴露的name对象调用Android方法。
实例:
android代码:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_test_web, container, false); webView = (WebView) v.findViewById(R.id.test_web_content); WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setDomStorageEnabled(true); // 兼容HTML5的DomStorage webView.setWebViewClient(new MyWebViewClient()); // 新建MyWebViewClient对象,为了webview不启动外部浏览器加载网页,像Chrome,UC等,使其在内部加载内容 webView.addJavascriptInterface(new ClickTransferHistory(),"transferhistory");// 点击transfer history按钮显示 return v; } public class ClickTransferHistory extends Object { @JavascriptInterface public void TransferHistoryClickToTransactions(String parameterGotFromJS){ // parameterGotFromJS为JS传给Android的参数,注意JS不能直接传对象给Android
} }
此时JS可以通过transferhistory.TransferHistoryClickToTransactions来调用android中的TransferHistoryClickToTransactions()方法。
JS代码:
<input type="button" value="Show Transfer History" onClick="transferhistory .TransferHistoryClickToTransactions(data)" />
Android调用JS中的方法,其中request为参数:
public void invokeJSMethod(final String pin, Handler handler) { //to do this.mHandler = handler; if (!TextUtils.isEmpty(callBack)) { webView.post(new Runnable() { @Override public void run() { String request = "{'type':'CHALLENGE_OTP', 'mode':'ONLINE', 'challengeOtp':'"+pin+"'}"; webView.evaluateJavascript("javascript:"+callBack + "(" + request + ")", new ValueCallback<String>() { @Override public void onReceiveValue(String value) {} }); } }); } }