WebView類直接繼承于Android的布局類絕對布局AbsoluteLayout,這是由于絕對布局沒有螢幕邊框的緣故,這樣加載Web網頁時才能左右滑動,因為通常Web網頁的寬度都是要遠遠大于手機螢幕的寬度的。該類還實作了兩個監聽器接口:ViewGroup.OnHierarchyChangeListener和
ViewTreeObserver.OnGlobalFocusChangeListener。前一個監聽器包括兩個事件方法:onChildViewAdded(View parent, View child)和onChildViewRemoved(View parent, View child),這兩個方法會分别在向WebView中添加或删除子控件時調用。後一個監聽器隻有一個事件方法:onGlobalFocusChanged(View oldFocus, View newFocus),該方法會在WebView中目前焦點位置發生變化時調用。當WebView由觸摸模式切換為非觸摸模式時,該方法的第一個參數oldFocus的值為null,當WebView由非觸摸模式切換為觸摸模式時,該方法的第二個參數newFocus的值為null。當WebView在單純的非觸摸模式(即沒有兩種模式之間的切換)下發生焦點的變化時,兩個參數的值均可能為null。
WebView使用了WebKit引擎來渲染網頁,提供了對網頁通路記錄的前進和後退操作,網頁放大和縮小操作以及文本搜尋操作等。預設情況下,WebView并沒有提供類似浏覽器的功能,也沒有開啟對JavaScript腳本的支援,并且頁面的錯誤也會被忽略掉。當加載網頁僅僅隻是展示資訊而沒有任何互動時,這是沒有任何問題的。如果需要完整的浏覽器功能,我們需要這樣做:
Uri uri = Uri.parse("http://www.example.com");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
WebView本身并不能提供類似浏覽器的功能。
WebView的使用既可以在XML布局檔案中配置,也可以在Activity的onCreate()方法中這樣來使用:
WebView webview = new WebView(this);
setContentView(webview);
上面的代碼把整個Activity的視窗空間設定為了WebView。然後像下面的代碼所示來加載網頁:
//這是最簡單的一種用法,需要注意的是,如果在加載網頁的過程中
//産生了錯誤,将不會有任何的異常被抛出。
webview.loadUrl("http://slashdot.org/");
//也可以直接加載一段HTML代碼
String summary = "<html><body>You scored <b>192</b> points.</body></html>";
webview.loadData(summary, "text/html", null);
下面的代碼展示了WebView的複雜一點的用法:
//在标題欄中展示加載進度
getWindow().requestFeature(Window.FEATURE_PROGRESS);
webview.getSettings().setJavaScriptEnabled(true);
final Activity activity = this;
webview.setWebChromeClient(new WebChromeClient()
{
//通過WebChromeClient對象我們可以擷取到網頁加載的進度
//值,進而可以對加載網頁的進度做出處理
public void onProgressChanged(WebView view, int progress)
{
//Activity和WebView在進度的度量上機關不一樣,是以
//這裡需要做個轉換。當進度達到100%時,進度條會自動消失
activity.setProgress(progress * 1000);
}
});
webview.setWebViewClient(new WebViewClient()
{
//通過WebViewClient對象我們可以對加載網頁時發生的錯誤
//進行處理
public void onReceivedError(WebView view, int errorCode, String description
, String failingUrl)
{
Toast.makeText(activity, "Oh no! " + description
, Toast.LENGTH_SHORT).show();
}
});
webview.loadUrl("http://developer.android.com/");