Android中WebView詳解

如果想WebView能夠訪問網絡,必須在AndroidManifest.xml裏面添加權限

  1. <uses-permission android:name="android.permission.INTERNET" />  

main.xml很簡單,就是一個WebView

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <WebView  
  8.         android:id="@+id/webView"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="fill_parent" />  
  11.   
  12. </LinearLayout>  

WebViewDemoActivity.java代碼:

  1. package com.tianjf;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.webkit.WebView;  
  6.   
  7. public class WebViewDemoActivity extends Activity {  
  8.   
  9.     private WebView mWebView;  
  10.   
  11.     @Override  
  12.     public void onCreate(Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.         setContentView(R.layout.main);  
  15.   
  16.         mWebView = (WebView) findViewById(R.id.webView);  
  17.   
  18.         // 得到WebSettings對象,設置支持JavaScript參數   
  19.         // 如果訪問的頁面中有JavaScript,則WebView必須設置支持JavaScript ,否則顯示空白頁面   
  20.         mWebView.getSettings().setJavaScriptEnabled(true);  
  21.         // 加載URL   
  22.         mWebView.loadUrl("http://www.baidu.com/");  
  23.     }  
  24. }  

運行一下就會看到URL被正確load出來了。

但是有個問題,當點擊鏈接繼續瀏覽,則會彈出系統默認的Browser,爲了能夠繼續在WebView中瀏覽,要用到shouldOverrideUrlLoading方法:

  1. @Override  
  2. public void onCreate(Bundle savedInstanceState) {  
  3.   
  4.     。。。。。。。。。。。。。。。。。。。。。。。。                  
  5.   
  6.     // 雖然Google主頁在WebView中顯示了,但是如果點擊鏈接繼續瀏覽,則會顯示到系統默認的Browser中   
  7.     // 爲了繼續在WebView中顯示,需要重寫shouldOverrideUrlLoading方法   
  8.     mWebView.setWebViewClient(new MyWebViewClient());  
  9.          
  10.   
  11.     。。。。。。。。。。。。。。。。。。。。。。。。          
  12.        }  
  13.   
  14. private class MyWebViewClient extends WebViewClient {  
  15.     @Override  
  16.     public boolean shouldOverrideUrlLoading(WebView view, String url) {  
  17.         view.loadUrl(url);  
  18.         return true;  
  19.     }  
  20. }  


另外,如果想按回退鍵回到上一個頁面,那麼

  1. /** 
  2.  * 按back鍵可以回到上個網頁 
  3.  */  
  4. @Override  
  5. public boolean onKeyDown(int keyCode, KeyEvent event) {  
  6.     if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {  
  7.         mWebView.goBack();  
  8.         return true;  
  9.     }  
  10.     return super.onKeyDown(keyCode, event);  
  11. }  

對於Android 2.0開始又多出了一種新的方法,對於Activity 可以單獨獲取Back鍵的按下事件,直接重寫onBackPressed 方法即可,代碼如下

  1. @Override  
  2. public void onBackPressed() {  
  3.  // 這裏處理邏輯代碼,該方法僅適用於2.0或更高版本的sdk   
  4. return ;  
  5. }  

如果想加載工程中的HTML,那麼可以用到下面的方法(前提是HTML放在assets目錄中)

  1. mWebView.loadUrl("file:///android_asset/test.html");  

如果想直接load一段HTML文,可以用下面的方法

  1. mWebView.loadData("<html><body>abcdefg</body></html>""text/html""utf-8");  

下面是WebView其他的一下用法:

設置允許訪問文件數據

  1. mWebView.getSettings().setAllowFileAccess(true);  

設置支持縮放

  1. mWebView.getSettings().setBuiltInZoomControls(true);  

設置是否保存密碼

  1. mWebView.getSettings().setSavePassword(false);  

設置支持各種不同的設備

  1. mWebView.getSettings().setUserAgentString("Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X;en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334bSafari/531.21.10");  

加載webview網頁時所要執行的一些方法

  1. mWebView.setWebViewClient(new WebViewClient() {  
  2.         // 新開頁面時用自己定義的webview來顯示,不用系統自帶的瀏覽器來顯示   
  3.         @Override  
  4.         public boolean shouldOverrideUrlLoading(WebView view, String url) {  
  5.             view.loadUrl(url);  
  6.             return true;  
  7.         }  
  8.           
  9.         // 開始加載網頁時要做的工作   
  10.         @Override  
  11.         public void onPageStarted(WebView view, String url, Bitmap favicon) {  
  12.             super.onPageStarted(view, url, favicon);  
  13.         }  
  14.           
  15.         // 加載完成時要做的工作   
  16.         @Override  
  17.         public void onPageFinished(WebView view, String url) {  
  18.             super.onPageFinished(view, url);  
  19.         }  
  20.           
  21.         // 加載錯誤時要做的工作   
  22.         @Override  
  23.         public void onReceivedError(WebView view, int errorCode,  
  24.                 String description, String failingUrl) {  
  25.             super.onReceivedError(view, errorCode, description, failingUrl);  
  26.         }  
  27.     });  

處理網頁中的一些對話框信息(提示對話框,帶選擇的對話框,帶輸入的對話框)

  1. mWebView.setWebChromeClient(new WebChromeClient() {  
  2.         // 提示對話框   
  3.         @Override  
  4.         public boolean onJsAlert(WebView view, String url, String message,  
  5.                 final JsResult result) {  
  6.             // 構建一個Builder來顯示網頁中的alert對話框   
  7.             Builder builder = new Builder(WebViewDemoActivity.this);  
  8.             builder.setTitle("提示對話框");  
  9.             builder.setMessage(message);  
  10.             builder.setPositiveButton(android.R.string.ok,  
  11.                     new AlertDialog.OnClickListener() {  
  12.                         @Override  
  13.                         public void onClick(DialogInterface dialog,  
  14.                                 int which) {  
  15.                             result.confirm();  
  16.                         }  
  17.                     });  
  18.             builder.setCancelable(false);  
  19.             builder.create();  
  20.             builder.show();  
  21.             return true;  
  22.         }  
  23.   
  24.         // 帶按鈕的對話框   
  25.         @Override  
  26.         public boolean onJsConfirm(WebView view, String url,  
  27.                 String message, final JsResult result) {  
  28.             Builder builder = new Builder(WebViewDemoActivity.this);  
  29.             builder.setTitle("帶選擇的對話框");  
  30.             builder.setMessage(message);  
  31.             builder.setPositiveButton(android.R.string.ok,  
  32.                     new AlertDialog.OnClickListener() {  
  33.                         @Override  
  34.                         public void onClick(DialogInterface dialog,  
  35.                                 int which) {  
  36.                             result.confirm();  
  37.                         }  
  38.                     });  
  39.             builder.setNeutralButton(android.R.string.cancel,  
  40.                     new AlertDialog.OnClickListener() {  
  41.                         @Override  
  42.                         public void onClick(DialogInterface dialog,  
  43.                                 int which) {  
  44.                             result.cancel();  
  45.                         }  
  46.                     });  
  47.             builder.setCancelable(false);  
  48.             builder.create();  
  49.             builder.show();  
  50.             return true;  
  51.         }  
  52.   
  53.         // 帶輸入框的對話框   
  54.         @Override  
  55.         public boolean onJsPrompt(WebView view, String url, String message,  
  56.                 String defaultValue, final JsPromptResult result) {  
  57.             LayoutInflater inflater = LayoutInflater  
  58.                     .from(WebViewDemoActivity.this);  
  59.             final View v = inflater.inflate(R.layout.myDialog, null);  
  60.             // 設置 TextView對應網頁中的提示信息   
  61.             ((TextView) v.findViewById(R.id.textView)).setText(message);  
  62.             // 設置EditText對應網頁中的輸入框   
  63.             ((EditText) v.findViewById(R.id.editText))  
  64.                     .setText(defaultValue);  
  65.   
  66.             Builder builder = new Builder(WebViewDemoActivity.this);  
  67.             builder.setTitle("帶輸入的對話框");  
  68.             builder.setView(v);  
  69.             builder.setPositiveButton(android.R.string.ok,  
  70.                     new AlertDialog.OnClickListener() {  
  71.                         @Override  
  72.                         public void onClick(DialogInterface dialog,  
  73.                                 int which) {  
  74.                             String value = ((EditText) v  
  75.                                     .findViewById(R.id.editText)).getText()  
  76.                                     .toString();  
  77.                             result.confirm(value);  
  78.                         }  
  79.                     });  
  80.             builder.setNegativeButton(android.R.string.cancel,  
  81.                     new AlertDialog.OnClickListener() {  
  82.                         @Override  
  83.                         public void onClick(DialogInterface dialog,  
  84.                                 int which) {  
  85.                             result.cancel();  
  86.                         }  
  87.                     });  
  88.             builder.setOnCancelListener(new DialogInterface.OnCancelListener() {  
  89.                 @Override  
  90.                 public void onCancel(DialogInterface dialog) {  
  91.                     result.cancel();  
  92.                 }  
  93.             });  
  94.             builder.create();  
  95.             builder.show();  
  96.             return true;  
  97.         }  
  98.   
  99.         // 設置網頁加載的進度條   
  100.         @Override  
  101.         public void onProgressChanged(WebView view, int newProgress) {  
  102.             WebViewDemoActivity.this.getWindow().setFeatureInt(  
  103.                     Window.FEATURE_PROGRESS, newProgress * 100);  
  104.             super.onProgressChanged(view, newProgress);  
  105.         }  
  106.           
  107.         // 設置應用程序的標題   
  108.         @Override  
  109.         public void onReceivedTitle(WebView view, String title) {  
  110.             WebViewDemoActivity.this.setTitle(title);  
  111.             super.onReceivedTitle(view, title);  
  112.         }  
  113.     });  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章