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) {} }); } }); } }
