說到android與H5的互動,首先要講下WebView基本使用.
WebView是View的一個子類,可以讓你在activity中顯示網頁。 可以在佈局檔案中寫入WebView:比如下面這個寫了一個填滿整個螢幕的WebView:
<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
複製程式碼
載入一個網頁,使用
WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.loadUrl(http://www.baidu.com/));
複製程式碼
當然還要注意要在manifest中加上訪問網路的許可權:
<manifest ... >
<uses-permission android:name="android.permission.INTERNET" />
...
</manifest>
複製程式碼
設定WebView要顯示的網頁
設定WevView要顯示的網頁方法有很多:
網際網路頁面直接用:
myWebView.loadUrl(“http://www.google.com“);
複製程式碼
本地檔案用:
myWebView.loadUrl(“file:///android_asset/XX.html“);
複製程式碼
本地檔案存放在:assets檔案中。
還可以直接載入html的字串,如:
String htmlString = "<h1>Title</h1><p>This is HTML text<br /><i>Formatted in italics</i><br />Anothor Line</p>";
// 載入這個html頁面
myWebView.loadData(htmlString, "text/html", "utf-8");
複製程式碼
在WebView中使用JavaScript
如果你想要載入的頁面中用了JavaScript,你必須為你的WebView使能 JavaScript。 一旦使能之後,你也可以自己建立介面在你的應用和JavaScript程式碼間進行互動。
WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
//支援JS
webSettings.setJavaScriptEnabled(true);
複製程式碼
處理頁面瀏覽 當使用者點選了你的WebView中的一個連結,預設的行為是Android啟動一個處理URL的應用,通常,預設的瀏覽器開啟並下載目標URL。 但是,你可以在你的WebView中覆蓋這一行為,使得連線仍在你的WebView中開啟。 之後,根據在WebView中維護的網頁瀏覽歷史,你可以允許使用者向前或向後瀏覽他們的網頁。
在WebView中開啟所有連結
WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.setWebViewClient(new WebViewClient());
複製程式碼
此時就OK了, 就可以在你的WebView中開啟連結了。
關於開啟連結位置的更多控制 如果你對在哪裡開啟連結需要更多的控制,你可以建立自己的類,繼承WebViewClient,然後覆寫shouldOverrideUrlLoading方法。
private class MyWebViewClient extends WebViewClient
{
//在這個方法裡面進行攔截使用者點選的Url
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url){
mWebView.loadUrl(url);
return true;
}
}
複製程式碼
與H5互動也很簡單
WebView mWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = mWebView.getSettings();
//支援JS
webSettings.setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new JsInteration(), "android");
/**
* 開啟js介面給H5呼叫,引數1為本地類名,引數2為別名;h5用window.別名.類名裡的方法名才能呼叫方法裡面的內容,例如:window.android.back();
* */
webView.addJavascriptInterface(new JSInterface(parentActivity), "jump");
/**
* 自己寫一個類,裡面是提供給H5訪問的方法
* */
public class JSInterface {
private Context mContxt;
public JSInterface(Context mContxt) {
this.mContxt = mContxt;
}
@JavascriptInterface
public void trade(String jsonStr) {
System.out.println("jsonStr===========" +jsonStr);
}
}
複製程式碼
H5頁面關聯設定
<button type="button" id="btn-android" class="send-coupon" onclick="shareAndroid();" style="display: block;">分享好友領紅包</button>
function shareAndroid(){
window.jump.trade(json_str_dict);
}
複製程式碼
H5裡面這行程式碼
window.jump.trade(shareValue);
複製程式碼
其中jump 對應
webView.addJavascriptInterface(new JSInterface(parentActivity),"jump");
複製程式碼
中的"jump",而trade()則對應介面JSInterface 裡面的trade方法,這兩個地方JS怎麼寫的我們安卓要對應上就行,然後從H5那邊傳來的資料就存在jsonStr裡面,我們獲取到這個資料進行操作就行了。是不是很簡單!
在這裡也說下可能碰到的webview載入網頁出現的問題。
Webview 載入一些連結出現白板現象,經過除錯onLoadResource已經正常執行,也就是資原始檔都已經成功載入,onReceivedSslError也沒有回撥到,用自帶瀏覽器和UC都是正常,證明連結本身沒有問題, Webview也正常執行,沒有出現錯誤,那就是Webview的配置問題了。 經過N個測試,把
webView.getSettings().setJavaScriptEnabled(true);//設定支援javascript指令碼
webView.getSettings().setAllowContentAccess(true);
webView.getSettings().setAllowFileAccessFromFileURLs(true);
webView.getSettings().setAppCacheEnabled(true);
webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setUseWideViewPort(true);
webView.getSettings().setPluginState(WebSettings.PluginState.ON);
複製程式碼
都開啟,還是未解決。 最終設定 webView.getSettings().setDomStorageEnabled(true);後成功。 按照API的說明 Sets whether the DOM storage API is enabled. The default value is false. 也就是是否開啟本地DOM儲存。應該是Html 5中的localStorage(可以使用Android4.4手機和Chrome Inspcet Device聯調),用於持久化的本地儲存,除非主動刪除資料,否則資料是永遠不會過期的,絕大多數的瀏覽器都是支援 localStorage 的,但是鑑於它的安全特性(任何人都能讀取到它,儘管有相應的限制,將敏感資料儲存在這裡依然不是明智之舉),Android 預設是關閉該功能的。
還有一種是載入https的URL時在5.0以上載入不了,5.0以下可以載入,這種情況可能是網頁中存在非https得資源,在5.0以上是預設關閉,需要設定,
webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
複製程式碼
另外記錄幾個websetting常用的幾個設定:
webSettings.setDomStorageEnabled ( boolean );//是否支援持久化儲存,儲存到本地
webSettings.setSupportZoom ( boolean ) ;// 設定支援縮放
webSettings.setBuiltInZoomControls ( boolean );//設定是否出現縮放工具
webSettings.setDatabaseEnabled ( boolean );//開啟database storage API 功能
webSettings.setDatabasePath(path);//設定資料庫快取路徑
webSettings.setAppCacheEnabled(boolean);//設定開啟application H5 Caches 功能
webSettings.setAppCachePath(path);//設定application caches 快取目錄
//設定webview自適應螢幕
webSettings.setLayoutAlgorithm ( LayoutAlgorithm.SINGLE_COLUMN );
webSettings.setLoadWithOverviewMode ( true );
複製程式碼