Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android學習指南之二十九:WebView使用詳解

Android學習指南之二十九:WebView使用詳解

編輯:關於android開發

       在智能移動設備上打開浏覽器浏覽網頁是移動用戶很經常的操作。本文就來講解Android中一個可以進行網頁顯示的控件WebView。同Chrome和Safari一樣,WebView的網頁渲染引擎也是Webkit。

       使用WebView控件進行Android互聯網程序開發又如下優勢: 

       1、可以打開遠程網址、也可以加載本地Html數據。

       2、可以搭建Java和Javascript交互橋梁。

       3、WebView控件可以高度定制。

       下面我們通過幾個例子來共同學習WebView的使用方法。

       一、先做一個例子熱熱身看看效果:通過WebView訪問一個網站

       1、先來一個簡單的例子,新建一個項目Lesson29_WebView。

       2、因為要訪問互聯網所以先在AndroidManifest.xml中設定權限:

XML/HTML代碼
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="android.basic.lesson29" android:versioncode="1" android:versionname="1.0">  
  3.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  4.         <activity android:label="@string/app_name" android:name=".MainWebView">  
  5.             <intent -filter="">  
  6.                 <action android:name="android.intent.action.MAIN">  
  7.                 <category android:name="android.intent.category.LAUNCHER">  
  8.             </category></action></intent>  
  9.         </activity>  
  10.   
  11.     </application>  
  12.     <uses -sdk="" android:minsdkversion="8">  
  13.     <uses -permission="" android:name="android.permission.INTERNET">  
  14. </uses></uses></manifest>   

       3、在res/layout/main.xml中放置一個輸入框,一個按鈕和一個WebView:

XML/HTML代碼
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#fff">  
  3. </linearlayout>  
  4. <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content">  
  5.     <edittext android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="http://android.yaohuiji.com" android:id="@+id/EditText01" android:layout_weight="1">  
  6.     </edittext>  
  7.     <button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Go" android:id="@+id/Button01" android:layout_weight="0">  
  8.     </button>  
  9. </linearlayout>  
  10.   
  11. <webview android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#fff" android:id="@+id/WebView01">  
  12. </webview>  

       4、在Activity文件的OnCreate方法中默認載入一個百度頁面,點擊按鈕時載入預設的網址:

Java代碼
  1. package android.basic.lesson29;   
  2.   
  3. import android.app.Activity;   
  4. import android.os.Bundle;   
  5. import android.view.View;   
  6. import android.webkit.WebView;   
  7. import android.widget.Button;   
  8. import android.widget.EditText;   
  9.   
  10. public class MainWebView extends Activity {   
  11.   
  12.     WebView mWebView;   
  13.   
  14.     /** Called when the activity is first created. */  
  15.     @Override  
  16.     public void onCreate(Bundle savedInstanceState) {   
  17.         super.onCreate(savedInstanceState);   
  18.         setContentView(R.layout.main);   
  19.   
  20.         //定義UI組件   
  21.         mWebView = (WebView) findViewById(R.id.WebView01);   
  22.         Button b1 = (Button) findViewById(R.id.Button01);   
  23.         final EditText et = (EditText) findViewById(R.id.EditText01);   
  24.   
  25.         //得到WebSetting對象,設置支持Javascript的參數   
  26.         mWebView.getSettings().setJavaScriptEnabled(true);   
  27.         //載入URL   
  28.         mWebView.loadUrl("http://www.baidu.com");   
  29.         //使頁面獲得焦點   
  30.         mWebView.requestFocus();   
  31.   
  32.         //給按鈕綁定單擊監聽器   
  33.         b1.setOnClickListener(new View.OnClickListener() {   
  34.   
  35.             @Override  
  36.             public void onClick(View v) {   
  37.                 //訪問編輯框中的網址   
  38.                 mWebView.loadUrl(et.getText().toString());   
  39.             }   
  40.         });   
  41.   
  42.     }   
  43. }  

       運行程序,在編輯框中輸入一個網址,點擊Go按鈕,就可以看到該網頁顯示,不過沒有經過任何縮放處理,在接下裡的例子我們繼續研究,如何做更多的控制。

       二、WebSettings基礎知識補充

       1、先看一下WebView的繼承關系,可以看到它不是在android.widget包中,而是在android.webkit包中。

 Android學習指南之二十九:WebView使用詳解

       2、WebSettings :WebView組件有一個輔助類叫WebSettings,它管理WebView的設置狀態。該對象可以通過WebView.getSettings()方法獲得。下面舉幾個例子來說明WebSettings的用法:

Java代碼
  1. //得到WebSettings對象,設置支持Javascript的參數   
  2.   
  3. mWebView.getSettings().setJavaScriptEnabled(true);   
  4.   
  5. //設置可以支持縮放   
  6.   
  7. mWebView.getSettings().setSupportZoom(true);   
  8.   
  9. //設置默認縮放方式尺寸是far   
  10.   
  11. mWebView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR);   
  12.   
  13. //設置出現縮放工具   
  14.   
  15. mWebView.getSettings().setBuiltInZoomControls(true);  

       三、加載assets目錄下的本地網頁

       WebView調用assets目錄下的本地網頁和圖片等資源非常方便,使用形如:

       wv.loadUrl("file:///android_asset/html/test1.html");

       的調用方法即可,代碼在第四段落裡。

 Android學習指南之二十九:WebView使用詳解

       在test1中點擊鏈接也可以跳轉到test2。

 Android學習指南之二十九:WebView使用詳解

       四、使用LoadData方法加載內容

       可以在Java文件中或者XML文件中定義HTML的片段,也可以在assets目錄中存放HTML文件,然後使用LoadData加載其中的內容,展示出來。下面我們使用第三部分的網頁來演示一下如何使用LoadData方法,並且看看他們之間的區別。

       1、新建項目Lesson29_WebView2

       2、新建2個Html文件在assets/html下,內容略去,res/layout/main.xml的內容也略去了,相信對你來說已經不成問題。

       3、MainWebView2.java 的內容如下:

Java代碼
  1. package android.basic.lesson29;   
  2.   
  3. import java.io.IOException;   
  4. import java.io.InputStream;   
  5.   
  6. import org.apache.http.util.ByteArrayBuffer;   
  7. import org.apache.http.util.EncodingUtils;   
  8.   
  9. import android.app.Activity;   
  10. import android.os.Bundle;   
  11. import android.view.View;   
  12. import android.webkit.WebView;   
  13. import android.widget.Button;   
  14.   
  15. public class MainWebView2 extends Activity {   
  16.     /** Called when the activity is first created. */  
  17.     @Override  
  18.     public void onCreate(Bundle savedInstanceState) {   
  19.         super.onCreate(savedInstanceState);   
  20.         setContentView(R.layout.main);   
  21.   
  22.         //定義UI組件   
  23.         Button b1 = (Button) findViewById(R.id.Button01);   
  24.         Button b2 = (Button) findViewById(R.id.Button02);   
  25.   
  26.         final WebView wv = (WebView) findViewById(R.id.WebView01);   
  27.   
  28.         //定義並綁定按鈕單擊監聽器   
  29.         b1.setOnClickListener(new View.OnClickListener() {   
  30.             @Override  
  31.             public void onClick(View v) {   
  32.                 //加載URL assets目錄下的內容可以用 "file:///android_asset" 前綴   
  33.                 wv.loadUrl("file:///android_asset/html/test1.html");   
  34.             }   
  35.         });   
  36.   
  37.         //定義並綁定按鈕單擊監聽器   
  38.         b2.setOnClickListener(new View.OnClickListener() {   
  39.             @Override  
  40.             public void onClick(View v) {   
  41.                 String data = "";   
  42.                 try {   
  43.                     // 讀取assets目錄下的文件需要用到AssetManager對象的Open方法打開文件   
  44.                     InputStream is = getAssets().open("html/test2.html");   
  45.                     // loadData()方法需要的是一個字符串數據所以我們需要把文件轉成字符串   
  46.                     ByteArrayBuffer baf = new ByteArrayBuffer(500);   
  47.                     int count = 0;   
  48.                     while ((count = is.read()) != -1) {   
  49.                         baf.append(count);   
  50.                     }   
  51.                     data = EncodingUtils.getString(baf.toByteArray(), "utf-8");   
  52.                 } catch (IOException e) {   
  53.                     e.printStackTrace();   
  54.                 }   
  55.                 // 下面兩種方法都可以加載成功   
  56.                 wv.loadData(data, "text/html", "utf-8");   
  57.                 // wv.loadDataWithBaseURL("", data, "text/html", "utf-8", "");   
  58.             }   
  59.         });   
  60.   
  61.     }   
  62. }  

       4、運行程序單擊第二個按鈕,效果如下:

 Android學習指南之二十九:WebView使用詳解

       對比上面的例子,我們可以看到兩個明顯的區別,其一,圖片沒加載出來,其二鏈接失效,點擊後無法加載test1.html 。

       五、兩個和WebView相關的重要對象:WebChromeClient和WebViewClient

       和WebView相關的輔助對象,除了WebSettings以外還有WebChromeClient和WebViewClient。

       接下來的這個例子內容比較豐富,雖然注釋比較清晰,但是您一次消化起來還是比較困難的,因此您需要的是一點點耐心,多看幾遍,最重要的是自己至少敲代碼敲一遍。

       1、在上面的例子中繼續增加內容,增加test3.html的內容:

XML/HTML代碼
  1.   
  2.      <script type="text/JavaScript">        
  3.      function alertFuction(){    
  4.        var a=1;   
  5.        var b=2    
  6.        alert(a+b);         
  7.      }     
  8.      function confirmFuction(){     
  9.         confirm("你確定要刪除嗎?")     
  10.      }     
  11.   
  12.      </script>      
  13.   
  14. 對話框測試   
  15. <input onclick="alertFuction()" value="提醒對話框" type="button">  
  16. <input onclick="confirmFuction()" value="選擇對話框" type="button">  
  17.   
  18.    <a href="test1.html">上一頁</a>  

       2、MainWebView3.java的內容,請注意注釋內容:

Java代碼
  1. package android.basic.lesson29;   
  2.   
  3. import java.io.FileOutputStream;   
  4.   
  5. import android.app.Activity;   
  6. import android.app.AlertDialog;   
  7. import android.app.AlertDialog.Builder;   
  8. import android.content.DialogInterface;   
  9. import android.graphics.Bitmap;   
  10. import android.graphics.Canvas;   
  11. import android.graphics.Picture;   
  12. import android.os.Bundle;   
  13. import android.view.KeyEvent;   
  14. import android.view.View;   
  15. import android.webkit.JsPromptResult;   
  16. import android.webkit.JsResult;   
  17. import android.webkit.WebChromeClient;   
  18. import android.webkit.WebView;   
  19. import android.webkit.WebViewClient;   
  20. import android.widget.Button;   
  21. import android.widget.Toast;   
  22.   
  23. public class MainWebView3 extends Activity {   
  24.   
  25.     /** Called when the activity is first created. */  
  26.     @Override  
  27.     public void onCreate(Bundle savedInstanceState) {   
  28.         super.onCreate(savedInstanceState);   
  29.         setContentView(R.layout.main);   
  30.   
  31.         // 定義UI組件   
  32.         Button b1 = (Button) findViewById(R.id.Button01);   
  33.         Button b2 = (Button) findViewById(R.id.Button02);   
  34.         Button b3 = (Button) findViewById(R.id.Button03);   
  35.   
  36.         final WebView wv = (WebView) findViewById(R.id.WebView01);   
  37.   
  38.         // 覆蓋默認後退按鈕的作用,替換成WebView裡的查看歷史頁面   
  39.         wv.setOnKeyListener(new View.OnKeyListener() {   
  40.   
  41.             @Override  
  42.             public boolean onKey(View v, int keyCode, KeyEvent event) {   
  43.                 if (event.getAction() == KeyEvent.ACTION_DOWN) {   
  44.                     if ((keyCode == KeyEvent.KEYCODE_BACK) && wv.canGoBack()) {   
  45.                         wv.goBack();   
  46.                         return true;   
  47.                     }   
  48.                 }   
  49.                 return false;   
  50.             }   
  51.         });   
  52.   
  53.         // 設置支持Javascript   
  54.         wv.getSettings().setJavaScriptEnabled(true);   
  55.   
  56.         // 定義並綁定按鈕單擊監聽器   
  57.         b1.setOnClickListener(new View.OnClickListener() {   
  58.             @Override  
  59.             public void onClick(View v) {   
  60.                 // 加載URL assets目錄下的內容可以用 "file:///android_asset" 前綴   
  61.                 wv.loadUrl("file:///android_asset/html/test1.html");   
  62.             }   
  63.         });   
  64.   
  65.         // 定義並綁定按鈕單擊監聽器   
  66.         b2.setOnClickListener(new View.OnClickListener() {   
  67.             @Override  
  68.             public void onClick(View v) {   
  69.                 // 加載URL assets目錄下的內容可以用 "file:///android_asset" 前綴   
  70.                 wv.loadUrl("file:///android_asset/html/test3.html");   
  71.             }   
  72.         });   
  73.   
  74.         // 定義並綁定按鈕單擊監聽器   
  75.         b3.setOnClickListener(new View.OnClickListener() {   
  76.             @Override  
  77.             public void onClick(View v) {   
  78.                 Picture pic = wv.capturePicture();   
  79.                 int width = pic.getWidth();   
  80.                 int height = pic.getHeight();   
  81.                 if (width > 0 && height > 0) {   
  82.                     Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);   
  83.                     Canvas canvas = new Canvas(bmp);   
  84.                     pic.draw(canvas);   
  85.                     try {   
  86.                         String fileName = "sdcard/" + System.currentTimeMillis() + ".png";   
  87.                         FileOutputStream fos = new FileOutputStream(fileName);   
  88.   
  89.                         if (fos != null) {   
  90.                             bmp.compress(Bitmap.CompressFormat.PNG, 90, fos);   
  91.                             fos.close();   
  92.                         }   
  93.                         Toast.makeText(getApplicationContext(), "截圖成功,文件名是:" + fileName, Toast.LENGTH_SHORT).show();   
  94.                     } catch (Exception e) {   
  95.                         e.printStackTrace();   
  96.                     }   
  97.                 }   
  98.             }   
  99.         });   
  100.   
  101.         // 創建WebViewClient對象   
  102.         WebViewClient wvc = new WebViewClient() {   
  103.   
  104.             @Override  
  105.             public boolean shouldOverrideUrlLoading(WebView view, String url) {   
  106.                 Toast.makeText(getApplicationContext(), "WebViewClient.shouldOverrideUrlLoading", Toast.LENGTH_SHORT)   
  107.                         .show();   
  108.                 // 使用自己的WebView組件來響應Url加載事件,而不是使用默認浏覽器器加載頁面   
  109.                 wv.loadUrl(url);   
  110.                 // 記得消耗掉這個事件。給不知道的朋友再解釋一下,Android中返回True的意思就是到此為止吧,事件就會不會冒泡傳遞了,我們稱之為消耗掉   
  111.                 return true;   
  112.             }   
  113.   
  114.             @Override  
  115.             public void onPageStarted(WebView view, String url, Bitmap favicon) {   
  116.                 Toast.makeText(getApplicationContext(), "WebViewClient.onPageStarted", Toast.LENGTH_SHORT).show();   
  117.                 super.onPageStarted(view, url, favicon);   
  118.             }   
  119.   
  120.             @Override  
  121.             public void onPageFinished(WebView view, String url) {   
  122.                 Toast.makeText(getApplicationContext(), "WebViewClient.onPageFinished", Toast.LENGTH_SHORT).show();   
  123.                 super.onPageFinished(view, url);   
  124.             }   
  125.   
  126.             @Override  
  127.             public void onLoadResource(WebView view, String url) {   
  128.                 Toast.makeText(getApplicationContext(), "WebViewClient.onLoadResource", Toast.LENGTH_SHORT).show();   
  129.                 super.onLoadResource(view, url);   
  130.             }   
  131.   
  132.         };   
  133.   
  134.         // 設置WebViewClient對象   
  135.         wv.setWebViewClient(wvc);   
  136.   
  137.         // 創建WebViewChromeClient   
  138.         WebChromeClient wvcc = new WebChromeClient() {   
  139.   
  140.             // 處理Alert事件   
  141.             @Override  
  142.             public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {   
  143.                 // 構建一個Builder來顯示網頁中的alert對話框   
  144.                 Builder builder = new Builder(MainWebView3.this);   
  145.                 builder.setTitle("計算1+2的值");   
  146.                 builder.setMessage(message);   
  147.                 builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() {   
  148.                     @Override  
  149.                     public void onClick(DialogInterface dialog, int which) {   
  150.                         result.confirm();   
  151.                     }   
  152.                 });   
  153.                 builder.setCancelable(false);   
  154.                 builder.create();   
  155.                 builder.show();   
  156.                 return true;   
  157.             }   
  158.   
  159.             @Override  
  160.             public void onReceivedTitle(WebView view, String title) {   
  161.                 MainWebView3.this.setTitle("可以用onReceivedTitle()方法修改網頁標題");   
  162.                 super.onReceivedTitle(view, title);   
  163.             }   
  164.   
  165.             // 處理Confirm事件   
  166.             @Override  
  167.             public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {   
  168.                 Builder builder = new Builder(MainWebView3.this);   
  169.                 builder.setTitle("刪除確認");   
  170.                 builder.setMessage(message);   
  171.                 builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() {   
  172.   
  173.                     @Override  
  174.                     public void onClick(DialogInterface dialog, int which) {   
  175.                         result.confirm();   
  176.                     }   
  177.   
  178.                 });   
  179.                 builder.setNeutralButton(android.R.string.cancel, new AlertDialog.OnClickListener() {   
  180.   
  181.                     @Override  
  182.                     public void onClick(DialogInterface dialog, int which) {   
  183.                         result.cancel();   
  184.                     }   
  185.   
  186.                 });   
  187.                 builder.setCancelable(false);   
  188.                 builder.create();   
  189.                 builder.show();   
  190.                 return true;   
  191.             }   
  192.   
  193.             // 處理提示事件   
  194.             @Override  
  195.             public boolean onJsPrompt(WebView view, String url, String message, String defaultValue,   
  196.                     JsPromptResult result) {   
  197.                 // 看看默認的效果   
  198.                 return super.onJsPrompt(view, url, message, defaultValue, result);   
  199.             }   
  200.         };   
  201.   
  202.         // 設置setWebChromeClient對象   
  203.         wv.setWebChromeClient(wvcc);   
  204.     }   
  205. }  

       3、運行程序,查看結果:

 Android學習指南之二十九:WebView使用詳解

       啟動起來時的畫面:

 Android學習指南之二十九:WebView使用詳解

       點擊第一個按鈕,我們可以看到WebViewClient對象中定義的方法的確被調用了。

Android學習指南之二十九:WebView使用詳解

       點擊第二個按鈕,我們看到加載的網頁中有兩個按鈕,我們知道默認情況下Android會直接忽略掉由javascript弄出來的alert等彈出信息,除非我們在WebChromeClient中覆蓋onJsAlert()方法和onJsConfirm()方法,讓我們分別點擊它們看看效果。

 Android學習指南之二十九:WebView使用詳解

Android學習指南之二十九:WebView使用詳解 

       接下來我們再頁面中跳轉幾次後,使用後退按鈕,查看我們是否屏蔽了Activity默認的行為,結果當然是屏蔽了^_^,這一段代碼沒有留意的同學回去在看一下吧。

       接下來我們把頁面切換到這一個網頁:

 Android學習指南之二十九:WebView使用詳解

       然後我們按下第三個保存圖片的按鈕,不出意外的話我們截取到了該頁的完整圖片,並把它保存到了sdcard中了。

       好了,因為篇幅關系,我們關於WebView的功能也只能介紹到這裡,關於WebView的其它功能我們在接下來的項目中會涉及到,到時候我們再一起學習,本講就到這裡吧,各位下次再見。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved