Android中WebView的詳細解釋
Android中WebView的詳細解釋:
1. 概念:
WebView(網路視圖)能載入顯示網頁,可以將其視為一個瀏覽器。它使用了WebKit渲染引擎載入顯示網頁。
2. 使用方法:
(1).執行個體化WebView組件:
A.在Activity中執行個體化WebView組件。eg:
WebView webView = new WebView(this);
B.調用WebView的loadUrl()方法,設定WevView要顯示的網頁.eg:
互連網用:webView.loadUrl(http://www.google.com);本地檔案用:webView.loadUrl(file:///android_asset/XX.html); 本地檔案存放在:assets 檔案中
C.調用Activity的setContentView( )方法來顯示網頁視圖。
D.需要在AndroidManifest.xml檔案中添加許可權,否則會出現Web page not available錯誤。
(2).自訂WebView組件繼承WebViewClient:
A.在布局檔案中聲明WebView。eg:
B.在Activity中執行個體化WebView。
C.調用WebView的loadUrl()方法,設定WebView要顯示的網頁.
D.調用setWebViewClient()方法設定WebView視圖。響應連結功能。
E.需要在AndroidManifest.xml檔案中添加許可權,否則出現Web page not available錯誤。
3. 兩種方法的區別:
(1).第一種方法:點選連結是新開Android的系統browser中響應該連結。
(2).第二種方法:點選連結由自己處理,而不是新開Android的系統browser中響應該連結。給WebView添加一個事件監聽對象(WebViewClient)並重寫其中的shouldOverrideUrlLoading方法:對網頁中超連結按鈕的響應。當按下某個串連時WebViewClient會調用這個方法,並傳遞參數:按下的url。
4. 總結:
(1). 用WebView點連結看了很多頁以後為了讓WebView支援回退功能,需要覆蓋覆蓋Activity類的onKeyDown()方法,如果不做任何處理,點擊系統回退剪鍵,整個瀏覽器會調用finish()而結束自身,而不是回退到上一頁面。
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) { // goBack()表示返回WebView的上一頁面 mWebView.goBack(); return true; } return super.onKeyDown(keyCode, event); }
(2). 設定WebView基本資料:
A.如果訪問的頁面中有Javascript,則webview必須設定支援Javascript。
webview.getSettings().setJavaScriptEnabled(true);
B.觸摸焦點起作用:
requestFocus();
C.取消捲軸:
this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
5. 整體代碼如下:
(1).MainActivity.java
package com.pansoft.webviewdemo;import android.annotation.SuppressLint;import android.app.Activity;import android.os.Bundle;import android.view.KeyEvent;import android.view.Window;import android.webkit.WebSettings;import android.webkit.WebView;import com.pansoft.webviewdemo.webView.MyWebView;public class MainActivity extends Activity { private WebView mWebView = null; private WebSettings mSettings = null; /** TAG */ private String TAG = getClass().getSimpleName(); /** URL */ private String FLG_URL = http://www.baidu.com/; private MyWebView myWebView; @SuppressLint(SetJavaScriptEnabled) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); // 第二種方法 init01(); // 第一種方法 // init02(); } /** * 載入的是webView本身的 */ private void init01() { setContentView(R.layout.activity_main); mWebView =(WebView)findViewById(R.id.webView1); mSettings = mWebView.getSettings(); // WebView設定支援JavaScript mSettings.setJavaScriptEnabled(true); // 載入URL mWebView.loadUrl(FLG_URL); myWebView = new MyWebView(this, mWebView); mWebView.setWebViewClient(myWebView); } /** * 載入的是系統內建的瀏覽器 */ private void init02() { mWebView = new WebView(this); mSettings = mWebView.getSettings(); mSettings.setJavaScriptEnabled(true); mWebView.loadUrl(FLG_URL); setContentView(mWebView); } @Override public void onBackPressed() { super.onBackPressed(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) { // goBack()表示返回WebView的上一頁面 mWebView.goBack(); return true; } return super.onKeyDown(keyCode, event); }}
(2).MyWebView.java
package com.pansoft.webviewdemo.webView;import android.content.Context;import android.graphics.Bitmap;import android.util.Log;import android.webkit.HttpAuthHandler;import android.webkit.WebView;import android.webkit.WebViewClient;/** * MyWebView * * @author Administrator * */public class MyWebView extends WebViewClient { private Context mContext; private WebView mWebView; private String TAG = getClass().getSimpleName(); /** * 構造方法 * * @param mContext * @param mWebView */ public MyWebView(Context mContext, WebView mWebView) { super(); this.mContext = mContext; this.mWebView = mWebView; } /** * 開啟連結前的事件,為了避免再次按的時候載入的是系統內建的瀏覽器,點選連結由自己處理 */ // 這個函數我們可以做很多操作,比如我們讀取到某些特殊的URL,於是就可以不開啟地址,取消這個操作,進行預先定義的其他動作,這對一個程式是非常必要的。 @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url != null) { mWebView.loadUrl(url); Log.d(TAG, --->shouldOverrideUrlLoading--->); } return true; } /** * 接收到Http請求的事件 */ @Override public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) { super.onReceivedHttpAuthRequest(view, handler, host, realm); } /** * 載入頁面開始的事件 */ // 這個事件就是開始載入頁面調用的,通常我們可以在這設定一個loading的頁面,告訴使用者程式在等待網路響應。 @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); Log.d(TAG, --->onPageStarted--->); } /** * 載入頁面完成的事件 */ // 同樣道理,我們知道一個頁面載入完成,於是我們可以關閉loading條,切換程式動作。 @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); Log.d(TAG, --->onPageFinished--->); } /** * 當瀏覽器訪問制定的網址發生錯誤時會通知我們應用程式,比如網路錯誤。 */ @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { super.onReceivedError(view, errorCode, description, failingUrl); }}
(3).activity_main.xml