WebView用法簡介

語言: CN / TW / HK

本文已參與「新人創作禮」活動,一起開啟掘金創作之路。

一、WebView簡單介紹

WebView控制元件可以使我們自己的app嵌入一個瀏覽器,並渲染各種各樣的網頁


二、WebView使用方法

1.因為要訪問網路,所以必須先新增聯網許可權.否則出現錯誤:Web page not available java <uses-permission android:name="android.permission.INTERNET" />

2.新增WebView元件的兩種方式(Activity中建立、佈局檔案中宣告)

java WebView wv = new WebView(this); // Activity中建立元件例項 ```xml

```

3.拿著元件例項,我們就可以載入網頁啦(網路頁面、本地頁面) java wv.loadUrl("http://quora.com"); // 載入網路頁面 java wv.loadUrl("file:///android_asset/index.html"); // 載入assets目錄下的本地頁面

4.WebView的常用功能集錦(排名不分先後,按需CV)

4.0、載入頁面

  • 載入指定頁面(網路、本地) java LoadUrl()
  • 載入指定資料 java wv.loadData()
  • 使用BaseUrl載入指定頁面 java wv.loadDataWithBaseURL()
  • 重新載入頁面所有資源 java wv.reload();

4.1、網頁中需要輸入賬號密碼時獲取手勢焦點

java wv.requestFocusFromTouch();

4.2、通過元件本身開啟超連結.不呼叫第三方瀏覽器

WebViewClient基本使用:提供網頁載入各個階段的通知 java wv.setWebViewClient(new WebViewClient()); // 方法一 java ww.setWebViewClient(new WebViewClient() { // 方法二 public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }); WebViewClient詳解

  • public boolean shouldOverrideUrlLoading(WebView view, String url) >告知我們應用程式是否需要接管控制網頁載入 >返回true->主程式接管網頁載入,false->WebView自己處理. > >注:1.POST請求方式不會回撥該方法 >  2.當訪問地址需自己處理時在該方法中截獲

  • public void onPageStarted(WebView view, String url, Bitmap favicon) >瀏覽器核心載入完成當前頁面時回撥

  • public void onLoadResource(WebView view, String url) >通知主程式WebView即將載入指定地址的頁面

  • public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) >瀏覽器訪問的頁面發生錯誤時回撥

  • public void onFormResubmission(WebView view, Message dontResend, Message resend) >瀏覽器需要重新發送POST請求時回撥該方法

  • public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) >通知應用程式可以將當前的url儲存在資料庫中,意味著當前的訪問url已經生效並被記錄在核心當中. 這個函式在網頁載入過程中只會被呼叫一次. 注意網頁前進後退並不會回撥這個函式.

  • public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) >當網頁載入資源過程中發現SSL錯誤會呼叫此方法. 我們應用程式必須做出響應,是取消請求handler.cancel(),還是繼續請求handler.proceed();核心的預設行為是handler.cancel();

  • public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) >通知應用程式WebView接收到了一個Http auth的請求,應用程式可以使用supplied設定webview的響應請求. 預設行為是cancel本次請求

  • public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) >提供應用程式同步一個處理按鍵事件的機會,選單快捷鍵需要被過濾掉。如果返回true,WebView不處理該事件,如果返回false, WebView會一直處理這個事件,因此在View鏈上沒有一個父類可以響應到這個事件. 預設行為是return false;

  • public void onScaleChanged(WebView view, float oldScale, float newScale) >通知應用程式WebView要被scale. 應用程式可以處理改事件,比如調整適配螢幕

  • public void onReceivedLoginRequest(WebView view, String realm, String account, String args) >通知應用程式有個自動登入的帳號過程

4.3、支援頁面中的JavaScript指令碼

java WebSettings ws = wv.getSettings(); // 先獲取Settings物件.後面常用 ws.setJavaScriptEnabled(true); ws.setJavaScriptCanOpenWindowsAutomatically(true);

4.4、啟用快取、設定快取模式

```java ws.setAppCacheEnabled(true); // 啟用快取

ws.setCacheMode(WebSettings.LOAD_DEFAULT); // 預設使用本地未過期的快取,否則從網路獲取

ws.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); // 優先使用快取

ws.setCacheMode(WebSettings.LOAD_CACHE_ONLY); // 僅使用快取

ws.setCacheMode(WebSettings.LOAD_NO_CACHE); // 禁用快取 ```

4.5、支援拖動放縮頁面

java ws.setSupportZoom(true); ws.setBuiltInZoomControls(true);

4.6、開啟頁面時自適應螢幕大小

java ws.setUseWideViewPort(true); ws.setLoadWithOverviewMode(true);

4.7、支援歷史回退.否則返回時會將WebView作為整體finish掉

覆寫Activity的onKeyDown() java @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && wv.canGoBack()) { wv.goBack(); return true; } return super.onKeyDown(keyCode, event); // 注意:直接返回false會出現問題 }

4.8、針對網頁載入進度進行處理

WebChromeClient:輔助WebView處理js的對話方塊、網站標題、網站圖示、載入進度 java wv.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int newProgress) { super.onProgressChanged(view, newProgress); if (newProgress == 100) { // TODO 網頁載入完成時需要進行的處理 } else { // TODO 網頁載入過程中需要進行的處理 } } });


WebChromeClient詳解

  • public void onProgressChanged(WebView view, int newProgress) >通知應用程式當前網頁載入的進度,如上程式碼

  • public void onReceivedTitle(WebView view, String title) >當document的title變化時,通知主程式

  • public void onReceivedIcon(WebView view, Bitmap icon) >當前頁面有個新的favicon時候,回撥該函式

  • public void onReceivedTouchIconUrl(WebView view, String url, boolean precomposed) >通知應用程式apple-touch-icon的 url

  • public void onShowCustomView(View view, CustomViewCallback callback) >通知應用程式WebView需要顯示一個custom view,主要用在視訊全屏H5Video support

  • public void onHideCustomView() >退出視訊通知

  • public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) >請求建立新視窗,如果我們應用程式接管這個請求,必須返回true,並且建立一個新的webview來承載主視窗. 如果應用程式不處理,則需要返回false,預設行為和返回false表現一樣.

  • public void onCloseWindow(WebView window) >通知應用程式從關閉傳遞過來的WebView並從view tree中remove

  • public boolean onJsAlert(WebView view, String url, String message, JsResult result) >通知應用程式顯示JS alert對話方塊,如果應用程式返回true核心認為應用程式處理這個訊息,返回false,核心自己處理

  • public boolean onJsConfirm(WebView view, String url, String message, JsResult result) >通知應用程式提供confirm對話方塊

  • public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) >通知應用程式顯示一個prompt對話方塊

  • public boolean onJsBeforeUnload(WebView view, String url, String message, JsResult result) >通知應用程式顯示一個對話方塊,讓使用者選擇是否離開當前頁面,這個回撥是javascript中的onbeforeunload事件,如果客戶端返回true,核心會認為客戶端提供對話方塊. 預設行為是return false

  • public void onExceededDatabaseQuota(String url, String databaseIdentifier, long quota, long estimatedDatabaseSize, long totalQuota, WebStorage.QuotaUpdater quotaUpdater) >通知應用程式webview核心web sql 資料庫超出配額,請求是否擴大資料庫磁碟配額。預設行為是不會增加資料庫配額

  • public void onReachedMaxAppCacheSize(long requiredStorage, long quota, WebStorage.QuotaUpdater quotaUpdater) >通知應用程式核心已經到達最大的appcache

  • public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) >當前頁面請求是否允許進行定位

4.9、支援內容重新佈局

java ws.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);

4.10、支援多視窗

java ws.supportMultipleWindows();

4.11、支援訪問檔案

java ws.setAllowFileAccess(true);

4.12、支援通過JS開啟新視窗

java ws.setJavaScriptCanOpenWindowsAutomatically(true);

4.13、支援自動載入圖片

java ws.setLoadsImagesAutomatically(true);