在Android中,可以使用Webview控制項來瀏覽網頁。通過使用該控制項,我們可以自製一個簡單的瀏覽器,運行效果1所示。
圖1 運行效果
1.WebView
在使用WebView控制項時,首先需要在xml布局檔案中定義一個WebView控制項,定義的方法如下:
1 <WebView 2 android:id="@+id/webView"3 android:layout_width="match_parent"4 android:layout_height="match_parent" />
WebView中提供了很多方法,例如,我們可以使用canGoBack()方法判斷是否能夠從該網頁返回上一個開啟的網頁;使用getTitle()和getUrl()方法獲得當前網頁的標題和URL路徑;使用loadUrl(String url)方法載入所要開啟的網頁等等。如下的代碼通過使用loadUrl()方法在WebView控制項中開啟了百度首頁。
1 private WebView mWebView;2 mWebView = (WebView)this.findViewById(R.id.webView);3 mWebView.loadUrl("http://www.baidu.com/");
2.WebSettings
WebSettings用來設定WebView的屬性和狀態。WebSettings和WebView存在於同一個生命週期中,可以使用如下的方法獲得WebSettings對象。
WebSettings webSettings = mWebView.getSettings();
在建立WebView時,系統會對WebView進行一些預設設定,當我們通過以上的方法得到WebSettings對象後,便可以從WebSettings對象中取出WebView的預設屬性和狀態了,當然了,我們也可以通過WebSettings對象對WebView的預設屬性和狀態進行設定。
WebSettings提供的一些常用的設定WebView的屬性和狀態的方法如下:
(1)setAllowFileAccess(boolean allow); //設定啟用或禁止訪問檔案資料
(2)setBuiltInZoomControls(boolean enabled); //設定是否支援縮放
(3)setDefaultFontSize(int size); //設定預設的字型大小
(4)setJavaScriptEnabled(boolean flag); //設定是否支援JavaScript
(5)setSupportZoom(boolean support); //設定是否支援變焦
3.WebViewClient
WebViewClient主要用來輔助WebView處理各種通知、請求等事件。我們可以通過WebView的setWebViewClient()方法,為WebView對象指定一個WebViewClient,具體的實現方法如下所示:
1 MyWebViewClient myWebViewClient = new MyWebViewClient(); 2 mWebView.setWebViewClient(myWebViewClient); 3 4 /* 5 * Class : MyWebViewClient,用於輔助WebView,處理各種通知、請求等事件 6 * Author : 部落格園-依舊淡然 7 */ 8 private class MyWebViewClient extends WebViewClient { 9 10 //重寫父類方法,讓新開啟的網頁在當前的WebView中顯示11 public boolean shouldOverrideUrlLoading(WebView view, String url) {12 view.loadUrl(url);13 return true;14 }15 16 }
可以看到,在如上的代碼中,我們通過在子類MyWebViewClient中重寫父類WebViewClient的shouldOverrideUrlLoading()方法,實現了讓新開啟的網頁在當前的WebView中進行顯示,而不是調用Android系統內建的瀏覽器進行訪問。
在WebViewClient中同樣提供了很多的方法,比如以下一些:
(1)doUpdateVisitedHistory(WebView view, String url, boolean isReload); //更新記錄
(2)onFormResubmission(WebView view, Message dontResend, Message resend); //重新請求網頁資料
(3)onLoadResource(WebView view, String url); //載入指定網址提供的資源
(4)onPageFinished(WebView view, String url); //網頁載入完畢
(5)onPageStarted(WebView view, String url, Bitmap favicon); //網頁開始載入
(6)onReceivedError(WebView view, int errorCode, String description, String failingUrl); //報告錯誤資訊
4.WebChromeClient
WebChromeClient主要用來輔助WebView處理Javascript的對話方塊、網站表徵圖、網站標題以及網頁載入進度等。
同樣地,我們可以通過WebView的setWebChromeClient()方法,為WebView對象指定一個WebChromeClient。
在WebChromeClient中,當網頁的載入進度發生變化時,onProgressChanged(WebView view, int newProgress)方法會被調用;當網頁的表徵圖發生改變時,onReceivedIcon(WebView view, Bitmap icon)方法會被調用;當網頁的標題發生改變時,onReceivedTitle(WebView view, String title)方法會被調用。利用這些方法,我們便可以很容易的獲得網頁的載入進度、網頁的標題和表徵圖等資訊了,正如下面的代碼所示:
1 MyWebChromeClient myWebChromeClient = new MyWebChromeClient(); 2 mWebView.setWebChromeClient(myWebChromeClient); 3 4 /* 5 * Class : 用於輔助WebView,處理JavaScript的對話方塊、網站表徵圖、網站標題、載入進度等 6 * Author : 部落格園-依舊淡然 7 */ 8 private class MyWebChromeClient extends WebChromeClient { 9 10 //獲得網頁的載入進度,顯示在右上方的TextView控制項中11 public void onProgressChanged(WebView view, int newProgress) {12 if(newProgress < 100) {13 String progress = newProgress + "%";14 mTextView_progress.setText(progress);15 } else {16 mTextView_progress.setText(" ");17 }18 }19 20 //獲得網頁的標題,作為應用程式的標題進行顯示21 public void onReceivedTitle(WebView view, String title) {22 MainActivity.this.setTitle(title);23 }24 25 }
5.WebView與Javascript
在WebView中不僅可以運行HTML代碼,更重要的是,WebView可以與Javascript互相調用。也就是說,在Javascript中可以擷取WebView的內容,與此同時,在WebView中也可以調用Javascript裡面的方法。
下面就來說說如何在WebView中調用Javascript裡面的方法。
這裡,我使用了百度地圖的API介面(一份內嵌了Javascript的HTML文檔),在該介面中提供如下的Javascript方法:
1 /*********************************/2 /* 尋找地點 */3 /*********************************/4 var city = new BMap.LocalSearch(map,{renderOptions:{map:map,autoViewport:true}}); 5 6 function findPlace(place)7 {8 city.search(place);9 }
我們要做的就是在WebView中調用findPlace()方法,完成地點的尋找。在WebView中調用Javascript裡面的方法是通過代碼WebView.loadUrl(“javascript:方法名()”)來實現的。如下的代碼,從EditText控制項中獲得使用者想要尋找的地名,然後調用了Javascript中的findPlace()方法,進行尋找。
1 /* 2 * Function : 點擊事件處理 3 * Author : 部落格園-依舊淡然 4 */ 5 public void onClick(View view) { 6 switch(view.getId()) { 7 case R.id.imagebutton_search: //尋找地名 8 String str = mEditText_input.getText().toString(); 9 String url = "javascript:findPlace('" + str + "')";10 mWebView.loadUrl(url);11 break;12 }13 }
比如,我們對“圓明園”進行尋找,可以看到2所示的尋找結果。
圖2 尋找“圓明園”