此篇博客是基於,上兩篇博客,Android-WebView與本地HTML (HTML調用-->Java的方法) , Android-WebView與本地HTML (Java調用--->HTML的方法) ;實現的一個綜合實用案例javascript
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Web頁面</title> <style type="text/css"> html,body{ width:100%; height:100%; padding:0px; margin:0px; } div.contact{ margin:3px; position:relative; text-align: center; width:100%; height:40px; background-color:#e0dede; } </style> <script type="text/javascript"> //保存模板html代碼 var template; //讓java調用,生成聯繫人數據 function show(arr){ for(var i=0;i<arr.length;i++){ var innerHtml = document.body.innerHTML; //利用模板替換生成每條數據 var row = template; row = row.replace('name',arr[i].name); row = row.replace('amount',arr[i].amount); row = row.replace('phone',arr[i].phone); row = row.replace('phone',arr[i].phone); //將html拼接到body標籤中 document.body.innerHTML = innerHtml+row; } } //初始化而且調用showcontacts去java請求數據 function initContacts(){ template = document.body.innerHTML; document.body.innerHTML = ""; contact.showcontacts(); } //按鈕點擊 時調用java的call function call(phone){ contact.call(phone); } //頁面加載時調用 // window.onload = initContacts(); </script> </head> <body onload="initContacts()"> <!-- 模板項 --> <div class="contact"> <span style="position:absolute;left:5px">name</span> <span style="position:absolute;top:20px;left:5px;font-size: 15px">amount</span> <span style="position:relative;top:5px;">phone</span> <button style="position:absolute;top:5px;right:5px" onclick="call('phone')">撥號</button> </div> </body> </html>
package cn.h5.java_and_html_call.bean; public class ContactInfo { private String name; private String amount; private String phone; public ContactInfo() { super(); // TODO Auto-generated constructor stub } public ContactInfo(String name, String amount, String phone) { super(); this.name = name; this.amount = amount; this.phone = phone; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAmount() { return amount; } public void setAmount(String amount) { this.amount = amount; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } }
package cn.h5.java_and_html_call.service; import java.util.ArrayList; import java.util.List; import cn.h5.java_and_html_call.bean.ContactInfo; public class ContactService { /** * 獲取聯繫人的數據 * @return */ public List<ContactInfo> getContacts(){ List<ContactInfo> contactInfos = new ArrayList<ContactInfo>(); contactInfos.add(new ContactInfo("劉備", "10000000", "13900123456")); contactInfos.add(new ContactInfo("關羽", "2000000", "18676868789")); contactInfos.add(new ContactInfo("張飛", "6000000", "18900888888")); contactInfos.add(new ContactInfo("曹操", "13000000", "18000888888")); return contactInfos; } }
package cn.h5.java_and_html_call; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.webkit.JavascriptInterface; import android.webkit.WebView; import org.json.JSONArray; import org.json.JSONObject; import java.util.List; import cn.h5.R; import cn.h5.java_and_html_call.bean.ContactInfo; import cn.h5.java_and_html_call.service.ContactService; public class MainActivity extends Activity { private ContactService service; private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main5); service = new ContactService(); /** * 你能夠把webview當作一個瀏覽器,webview裏面有一個插件,能夠把一個java對象傳遞給webview的插件, * 當插件獲得這個對象以後,就能夠讓網頁裏面的 javascript代碼對這個java對象進行調用 */ webView = findViewById(R.id.webview); /** * 加載本地的 contacts.html 文件 */ webView.loadUrl("file:///android_asset/contacts.html"); /** * webview默認是不可以執行javascript * 如下代碼是設置容許webview可以執行javascript代碼 */ webView.getSettings().setJavaScriptEnabled(true); /** * 把Java對象傳遞給WebView的插件 * 讓JavaScript調用 ---> Java ContactPlugin類中的 方法 */ webView.addJavascriptInterface(new ContactPlugin(),"contact" ); } /** * 此ContactPlugin類中的方法,和JavaScript定義的一致 * 目的是爲了讓JavaScript調用 --> ContactPlugin類中的方法 */ private final class ContactPlugin{ /** * contacts.html 被加載就會 調用showcontacts方法來得到JSON數據 給 javascript:show(" + json + ") * * 注意:初始化數據,由JavaScript調用, * 得到數據後 轉換爲JSON而且調用JavaScript的show方法, * 把數據給 JavaScript的show方法,而後HTML就把列表數據展現出來了 */ @JavascriptInterface public void showcontacts(){ Log.d("@@@", "showcontacts 被JavaScript頁面加載的時候 調用了"); try { List<ContactInfo> contacts = service.getContacts(); JSONArray jsonArray = new JSONArray(); for(ContactInfo info:contacts){ JSONObject jsonObject = new JSONObject(); jsonObject.put("name", info.getName()); jsonObject.put("amount", info.getAmount()); jsonObject.put("phone", info.getPhone()); jsonArray.put(jsonObject); } final String json = jsonArray.toString(); // Log.d("@@@", "json=======" + json); /** * webView.loadUrl("javascript:show(" + json + ")"); * 注意:像這種方法不能寫在這裏,不然沒效果一直阻塞的,打印不了:json=======後 * 解決方案: * 須要加入runOnUiThread,才能解決此問題; * 這個問題解決了兩個小時 才發現是這裏的問題,開始一直覺得是html/js有問題 */ // webView.loadUrl("javascript:show(" + json + ")"); runOnUiThread(new Runnable() { @Override public void run() { /** * Android WebView執行----> javascript代碼 * Java調用----> JavaScript的show方法 把這些列表JSON數據,給JavaScript的show方法,而後HTML就把列表數據展現出來了 */ webView.loadUrl("javascript:show(" + json + ")"); } }); Log.d("@@@", "json=======後"); } catch (Exception e) { e.printStackTrace(); Log.d("@@@", "e.ttt:" + e.toString()); } } /** * 點擊HTML列表上的電話號碼後,此方法被JavaScript調用 * 讓JavaScript調用 打電話 * @param phone */ @JavascriptInterface public void call(String phone){ Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phone)); startActivity(intent); } } }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!-- 定義WebView 1.WebView能夠展示處理本地的HTML相關; 2.WebView能夠展示處理網絡的HTML相關; 3.WebView能夠製做自定義瀏覽器; .... --> <WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent"></WebView> </LinearLayout>