天天看點

Android WebView類解析

  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/");