2010-05-14 57 views

回答

119

source code

// Instance of WebViewClient that is the client callback. 
private volatile WebViewClient mWebViewClient; 
// Instance of WebChromeClient for handling all chrome functions. 
private volatile WebChromeClient mWebChromeClient; 

// SOME OTHER SUTFFF....... 

/** 
* Set the WebViewClient. 
* @param client An implementation of WebViewClient. 
*/ 
public void setWebViewClient(WebViewClient client) { 
    mWebViewClient = client; 
} 

/** 
* Set the WebChromeClient. 
* @param client An implementation of WebChromeClient. 
*/ 
public void setWebChromeClient(WebChromeClient client) { 
    mWebChromeClient = client; 
} 

使用WebChromeClient讓您處理JavaScript對話框,網站圖標,標題和進度。看一下這個例子:Adding alert() support to a WebView

乍一看,有太多的區別WebViewClient & WebChromeClient。但是,基本上:如果您正在開發不需要太多功能但呈現HTML的WebView,則可以使用WebViewClient。另一方面,如果您想(例如)加載正在呈現的頁面的圖標,則應使用WebChromeClient對象並覆蓋onReceivedIcon(WebView view, Bitmap icon)

大部分的時間,如果你不想操心這些東西你可以這樣做:

webView= (WebView) findViewById(R.id.webview); 
webView.setWebChromeClient(new WebChromeClient()); 
webView.setWebViewClient(new WebViewClient()); 
webView.getSettings().setJavaScriptEnabled(true); 
webView.loadUrl(url); 

和你的WebView會(理論上)已經實現了所有功能(如Android本機瀏覽器)。

+20

在這種形式下,答案是不完整的。 ChromeClient允許處理列舉的東西,但ViewClient是什麼,以及它們之間的相似之處和不同點? – Pentium10 2010-05-14 16:18:55

+3

此方法是否有助於改進默認webview的一些不好的功能? 特別是對於css3動畫和轉換? – 2012-12-22 12:00:23

+2

我不這麼認爲。 – Cristian 2012-12-23 00:13:00

19

我覺得這個問題需要更多的細節。我的答案受到Android編程,書呆子牧場指南(第二版)的啓發。

默認情況下,,JavaScript在WebView中關閉。你並不總是需要它,但對於某些應用程序,可能需要它。

加載URL必須在配置完WebView後完成,所以最後要做。在此之前,您通過調用getSettings()來打開JavaScript以獲取WebSettings實例並調用WebSettings.setJavaScriptEnabled(true)。 WebSettings是您可以修改WebView的三種方法中的第一種。它具有可以設置的各種屬性,如用戶代理字符串和文本大小。

之後,您將配置您的WebViewClient。 WebViewClient是一個事件接口。通過提供您自己的WebViewClient實現,您可以響應渲染事件。例如,您可以檢測渲染器何時開始從特定URL加載圖像,或者決定是否向服務器重新提交POST請求。

WebViewClient有許多方法可以覆蓋,其中大多數方法你不會處理。但是,您確實需要替換默認的WebViewClient的實現shouldOverrideUrlLoading(WebView, String)。此方法確定在WebView中加載新URL時會發生什麼情況,例如通過按鏈接。如果返回true,則說「不處理這個URL,我正在處理它」。如果您返回false,則表示「繼續並加載此URL,WebView,我沒有對它做任何處理。「

默認實現會引發URL的隱式意圖,就像您之前做的一樣。但現在,這將是一個嚴重的問題。某些Web應用程序所做的第一件事是將您重定向到網站的移動版本。使用默認的WebViewClient,這意味着您可以立即發送到用戶的默認Web瀏覽器。這正是你想要避免的。 修復很簡單 - 只需重寫默認實現並返回false。

使用WebChromeClient雲杉東西 既然你正在創建自己的WebView,讓我們通過添加一個進度條,並與加載頁面的標題更新工具欄上的字幕雲杉它一點時間。

要連接ProgressBar,您將在WebView上使用第二個回調:WebChromeClient。

WebViewClient是一個響應渲染事件的接口; WebChromeClient是一個事件接口,用於響應那些應該改變瀏覽器周圍鉻元素的事件。這包括JavaScript警報,網站圖標,當然還有更新加載進度和當前頁面的標題。

掛在onCreateView(…)。使用WebChromeClient修飾事物 進度更新和標題更新每個都有自己的回調方法, onProgressChanged(WebView, int)onReceivedTitle(WebView, String)。您從onProgressChanged(WebView, int)收到的進度是一個從0到100的整數。如果它是100,那麼您知道 頁面已完成加載,因此通過將ProgressBar的可見性設置爲View.GONE來隱藏ProgressBar。

免責聲明:這一信息是取自Android的程序設計:大書呆子牧場指南從作者的許可。欲瞭解更多 有關此書的信息或購買副本,請訪問 bignerdranch.com。