WebView常用方法
String getUrl():獲取當前頁面的URL。
reload():重新reload當前的URL撇他,即刷新茄猫。
boolean canGoBack():用來確認WebView里是否還有可回退的歷史記錄。通常我們會在WebView里重寫返回鍵的點擊事件困肩,通過該方法判斷WebView里是否還有歷史記錄划纽,若有則返回上一頁。
boolean canGoForward():用來確認WebView是否還有可向前的歷史記錄锌畸。
boolean canGoBackOrForward(int steps):以當前的頁面為起始點勇劣,用來確認WebView的歷史記錄是否足以后退或前進給定的步數(shù),正數(shù)為前進蹋绽,負數(shù)為后退芭毙。
goBack():在WebView歷史記錄后退到上一項筋蓖。
goForward():在WebView歷史記錄里前進到下一項。
goBackOrForward(int steps):以當前頁面為起始點退敦,前進或后退歷史記錄中指定的步數(shù)粘咖,正數(shù)為前進,負數(shù)為后退侈百。
clearCache(boolean includeDiskFiles):清空網(wǎng)頁訪問留下的緩存數(shù)據(jù)瓮下。需要注意的時,由于緩存是全局的钝域,所以只要是WebView用到的緩存都會被清空讽坏,即便其他地方也會使用到。該方法接受一個參數(shù)例证,從命名即可看出作用路呜。若設(shè)為false,則只清空內(nèi)存里的資源緩存织咧,而不清空磁盤里的胀葱。
clearHistory():清除當前webview訪問的歷史記錄。
clearFormData():清除自動完成填充的表單數(shù)據(jù)笙蒙。需要注意的是抵屿,該方法僅僅清除當前表單域自動完成填充的表單數(shù)據(jù),并不會清除WebView存儲到本地的數(shù)據(jù)捅位。
onPause():當頁面被失去焦點被切換到后臺不可見狀態(tài)轧葛,需要執(zhí)行onPause操作,該操作會通知內(nèi)核安全地暫停所有動作艇搀,比如動畫的執(zhí)行或定位的獲取等尿扯。需要注意的是該方法并不會暫停JavaScript的執(zhí)行,若要暫停JavaScript的執(zhí)行請使用接下來的這個方法中符。
onResume():在先前調(diào)用onPause()后姜胖,我們可以調(diào)用該方法來恢復(fù)WebView的運行。
pauseTimers():該方法面向全局整個應(yīng)用程序的webview淀散,它會暫停所有webview的layout右莱,parsing,JavaScript Timer档插。當程序進入后臺時慢蜓,該方法的調(diào)用可以降低CPU功耗。
resumeTimers():恢復(fù)pauseTimers時的所有操作郭膛。
destroy():銷毀WebView晨抡。需要注意的是:這個方法的調(diào)用應(yīng)在WebView從父容器中被remove掉之后。我們可以手動地調(diào)用
?WebSettings
WebSetings是用來管理webview配置的類
WebSetings對象可已通過 WebView.getSettings()獲得
WebSettings常用方法
setJavaScriptEnabled(boolean flag):設(shè)置WebView是否可以運行JavaScript。
setJavaScriptCanOpenWindowsAutomatically(boolean flag):設(shè)置WebView是否可以由JavaScript自動打開窗口耘柱,默認為false如捅,通常與JavaScript的window.open()配合使用。
setAllowFileAccess(boolean allow):啟用或禁用WebView訪問文件數(shù)據(jù)调煎。
setBlockNetworkImage(boolean flag):禁止或允許WebView從網(wǎng)絡(luò)上加載圖片镜遣。需要注意的是,如果設(shè)置是從禁止到允許的轉(zhuǎn)變的話士袄,圖片數(shù)據(jù)并不會在設(shè)置改變后立刻去獲取悲关,而是在WebView調(diào)用reload()的時候才會生效。
這個時候娄柳,需要確保這個app擁有訪問Internet的權(quán)限寓辱,否則會拋出安全異常。
通常沒有禁止圖片加載的需求的時候赤拒,完全不用管這個方法秫筏,因為當我們的app擁有訪問Internet的權(quán)限時,這個flag的默認值就是false挎挖。
setSupportZoom(boolean support):設(shè)置是否支持縮放跳昼。
setBuiltInZoomControls(boolean enabled):顯示或不顯示縮放按鈕(wap網(wǎng)頁不支持)。
setSupportMultipleWindows(boolean support):設(shè)置WebView是否支持多窗口肋乍。
setLayoutAlgorithm(WebSettings.LayoutAlgorithm l):指定WebView的頁面布局顯示形式,調(diào)用該方法會引起頁面重繪敷存。默認值為LayoutAlgorithm#NARROW_COLUMNS墓造。
setNeedInitialFocus(boolean flag):通知WebView是否需要設(shè)置一個節(jié)點獲取焦點當WebView#requestFocus(int,android.graphics.Rect)被調(diào)用時,默認為true锚烦。
setAppCacheEnabled(boolean flag):啟用或禁用應(yīng)用緩存觅闽。
setAppCachePath(String appCachePath):設(shè)置應(yīng)用緩存路徑,這個路徑必須是可以讓app寫入文件的涮俄。該方法應(yīng)該只被調(diào)用一次蛉拙,重復(fù)調(diào)用會被無視~
setCacheMode(int mode):用來設(shè)置WebView的緩存模式。當我們加載頁面或從上一個頁面返回的時候彻亲,會按照設(shè)置的緩存模式去檢查并使用(或不使用)緩存孕锄。
緩存模式有四種:
1.LOAD_DEFAULT:默認的緩存使用模式。在進行頁面前進或后退的操作時苞尝,如果緩存可用并未過期就優(yōu)先加載緩存畸肆,否則從網(wǎng)絡(luò)上加載數(shù)據(jù)。這樣可以減少頁面的網(wǎng)絡(luò)請求次數(shù)宙址。
2.LOAD_CACHE_ELSE_NETWORK:只要緩存可用就加載緩存轴脐,哪怕它們已經(jīng)過期失效。如果緩存不可用就從網(wǎng)絡(luò)上加載數(shù)據(jù)。
3.LOAD_NO_CACHE:不加載緩存大咱,只從網(wǎng)絡(luò)加載數(shù)據(jù)恬涧。
4.LOAD_CACHE_ONLY:不從網(wǎng)絡(luò)加載數(shù)據(jù),只從緩存加載數(shù)據(jù)碴巾。
通常我們可以根據(jù)網(wǎng)絡(luò)情況將這幾種模式結(jié)合使用溯捆,比如有網(wǎng)的時候使用LOAD_DEFAULT,離線時使用LOAD_CACHE_ONLY餐抢、LOAD_CACHE_ELSE_NETWORK现使,讓用戶不至于在離線時啥都看不到。
setDatabaseEnabled(boolean flag):啟用或禁用數(shù)據(jù)庫緩存旷痕。
setDomStorageEnabled(boolean flag):啟用或禁用DOM緩存碳锈。
setUserAgentString(String ua):設(shè)置WebView的UserAgent值。
setDefaultEncodingName(String encoding):設(shè)置編碼格式欺抗,通常都設(shè)為“UTF-8”售碳。
?WebViewClient
這個類就像WebView的委托人一樣,是幫助WebView處理各種通知和請求事件的绞呈,我們可以稱他為WebView的“內(nèi)政大臣”贸人。
onLoadResource(WebView view, String url):該方法在加載頁面資源時會回調(diào),每一個資源(比如圖片)的加載都會調(diào)用一次佃声。
onPageStarted(WebView view, String url, Bitmap favicon):該方法在WebView開始加載頁面且僅在Main frame loading(即整頁加載)時回調(diào)艺智,一次Main frame的加載只會回調(diào)該方法一次。我們可以在這個方法里設(shè)定開啟一個加載的動畫圾亏,告訴用戶程序在等待網(wǎng)絡(luò)的響應(yīng)十拣。
onPageFinished(WebView view, String url):該方法只在WebView完成一個頁面加載時調(diào)用一次(同樣也只在Main frame loading時調(diào)用),我們可以可以在此時關(guān)閉加載動畫志鹃,進行其他操作夭问。
onReceivedError(WebView view, WebResourceRequest request, WebResourceError error):該方法在web頁面加載錯誤時回調(diào),這些錯誤通常都是由無法與服務(wù)器正常連接引起的曹铃,最常見的就是網(wǎng)絡(luò)問題缰趋。
這個方法有兩個地方需要注意:
1.這個方法只在與服務(wù)器無法正常連接時調(diào)用,類似于服務(wù)器返回錯誤碼的那種錯誤(即HTTP ERROR)陕见,該方法是不會回調(diào)的秘血,因為你已經(jīng)和服務(wù)器正常連接上了(全怪官方文檔(︶^︶));
2.這個方法是新版本的onReceivedError()方法评甜,從API23開始引進直撤,與舊方法onReceivedError(WebView view,int errorCode,String description,String failingUrl)不同的是,新方法在頁面局部加載發(fā)生錯誤時也會被調(diào)用(比如頁面里兩個子Tab或者一張圖片)蜕着。這就意味著該方法的調(diào)用頻率可能會更加頻繁谋竖,所以我們應(yīng)該在該方法里執(zhí)行盡量少的操作红柱。
onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse):上一個方法提到onReceivedError并不會在服務(wù)器返回錯誤碼時被回調(diào),那么當我們需要捕捉HTTP ERROR并進行相應(yīng)操作時應(yīng)該怎么辦呢蓖乘?API23便引入了該方法锤悄。當服務(wù)器返回一個HTTP ERROR并且它的status code>=400時,該方法便會回調(diào)嘉抒。這個方法的作用域并不局限于Main Frame零聚,任何資源的加載引發(fā)HTTP ERROR都會引起該方法的回調(diào),所以我們也應(yīng)該在該方法里執(zhí)行盡量少的操作些侍,只進行非常必要的錯誤處理等隶症。
onReceivedSslError(WebView view, SslErrorHandler handler, SslError error):當WebView加載某個資源引發(fā)SSL錯誤時會回調(diào)該方法,這時WebView要么執(zhí)行handler.cancel()取消加載岗宣,要么執(zhí)行handler.proceed()方法繼續(xù)加載(默認為cancel)蚂会。需要注意的是,這個決定可能會被保留并在將來再次遇到SSL錯誤時執(zhí)行同樣的操作耗式。
WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request):當WebView需要請求某個數(shù)據(jù)時胁住,這個方法可以攔截該請求來告知app并且允許app本身返回一個數(shù)據(jù)來替代我們原本要加載的數(shù)據(jù)。
比如你對web的某個js做了本地緩存刊咳,希望在加載該js時不再去請求服務(wù)器而是可以直接讀取本地緩存的js彪见,這個方法就可以幫助你完成這個需求。你可以寫一些邏輯檢測這個request娱挨,并返回相應(yīng)的數(shù)據(jù)余指,你返回的數(shù)據(jù)就會被WebView使用,如果你返回null跷坝,WebView會繼續(xù)向服務(wù)器請求浪规。
boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request):哈~ 終于到了這個方法,在最開始的基礎(chǔ)演示時我們用到了這個方法探孝。從實踐中我們知道,當我們沒有給WebView提供WebViewClient時誉裆,WebView如果要加載一個url會向ActivityManager尋求一個適合的處理者來加載該url(比如系統(tǒng)自帶的瀏覽器)顿颅,這通常是我們不想看到的。于是我們需要給WebView提供一個WebViewClient足丢,并重寫該方法返回true來告知WebView url的加載就在app中進行粱腻。這時便可以實現(xiàn)在app內(nèi)訪問網(wǎng)頁。
onScaleChanged(WebView view, float oldScale, float newScale):當WebView得頁面Scale值發(fā)生改變時回調(diào)斩跌。
boolean shouldOverrideKeyEvent(WebView view, KeyEvent event):默認值為false绍些,重寫此方法并return true可以讓我們在WebView內(nèi)處理按鍵事件。
WebChromeClient
如果說WebViewClient是幫助WebView處理各種通知耀鸦、請求事件的“內(nèi)政大臣”的話柬批,那么WebChromeClient就是輔助WebView處理Javascript的對話框啸澡,網(wǎng)站圖標,網(wǎng)站title氮帐,加載進度等偏外部事件的“外交大臣”嗅虏。
onProgressChanged(WebView view, int newProgress):當頁面加載的進度發(fā)生改變時回調(diào),用來告知主程序當前頁面的加載進度上沐。
onReceivedIcon(WebView view, Bitmap icon):用來接收web頁面的icon皮服,我們可以在這里將該頁面的icon設(shè)置到Toolbar。
onReceivedTitle(WebView view, String title):用來接收web頁面的title参咙,我們可以在這里將頁面的title設(shè)置到Toolbar龄广。
以下兩個方法是為了支持web頁面進入全屏模式而存在的(比如播放視頻),如果不實現(xiàn)這兩個方法蕴侧,該web上的內(nèi)容便不能進入全屏模式择同。
onShowCustomView(View view, WebChromeClient.CustomViewCallback callback):該方法在當前頁面進入全屏模式時回調(diào),主程序必須提供一個包含當前web內(nèi)容(視頻 or Something)的自定義的View戈盈。
onHideCustomView():該方法在當前頁面退出全屏模式時回調(diào)奠衔,主程序應(yīng)在這時隱藏之前show出來的View。
Bitmap getDefaultVideoPoster():當我們的Web頁面包含視頻時塘娶,我們可以在HTML里為它設(shè)置一個預(yù)覽圖归斤,WebView會在繪制頁面時根據(jù)它的寬高為它布局。而當我們處于弱網(wǎng)狀態(tài)下時刁岸,我們沒有比較快的獲取該圖片脏里,那WebView繪制頁面時的gitWidth()方法就會報出空指針異常~ 于是app就crash了。虹曙。
這時我們就需要重寫該方法迫横,在我們尚未獲取web頁面上的video預(yù)覽圖時,給予它一個本地的圖片酝碳,避免空指針的發(fā)生矾踱。
View getVideoLoadingProgressView():重寫該方法可以在視頻loading時給予一個自定義的View,可以是加載圓環(huán) or something疏哗。
boolean onJsAlert(WebView view, String url, String message, JsResult result):處理Javascript中的Alert對話框呛讲。
boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result):處理Javascript中的Prompt對話框。
boolean onJsConfirm(WebView view, String url, String message, JsResult result):處理Javascript中的Confirm對話框
boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, WebChromeClient.FileChooserParams fileChooserParams):該方法在用戶進行了web上某個需要上傳文件的操作時回調(diào)返奉。我們應(yīng)該在這里打開一個文件選擇器贝搁,如果要取消這個請求我們可以調(diào)用filePathCallback.onReceiveValue(null)并返回true。
onPermissionRequest(PermissionRequest request):該方法在web頁面請求某個尚未被允許或拒絕的權(quán)限時回調(diào)芽偏,主程序在此時調(diào)用grant(String [])或deny()方法雷逆。如果該方法沒有被重寫,則默認拒絕web頁面請求的權(quán)限污尉。
onPermissionRequestCanceled(PermissionRequest request):該方法在web權(quán)限申請權(quán)限被取消時回調(diào)膀哲,這時應(yīng)該隱藏任何與之相關(guān)的UI界面往产。
WebChromeClient
如果說WebViewClient是幫助WebView處理各種通知、請求事件的“內(nèi)政大臣”的話等太,那么WebChromeClient就是輔助WebView處理Javascript的對話框捂齐,網(wǎng)站圖標,網(wǎng)站title缩抡,加載進度等偏外部事件的“外交大臣”奠宜。
onProgressChanged(WebView view, int newProgress):當頁面加載的進度發(fā)生改變時回調(diào),用來告知主程序當前頁面的加載進度瞻想。
onReceivedIcon(WebView view, Bitmap icon):用來接收web頁面的icon压真,我們可以在這里將該頁面的icon設(shè)置到Toolbar。
onReceivedTitle(WebView view, String title):用來接收web頁面的title蘑险,我們可以在這里將頁面的title設(shè)置到Toolbar滴肿。
以下兩個方法是為了支持web頁面進入全屏模式而存在的(比如播放視頻),如果不實現(xiàn)這兩個方法佃迄,該web上的內(nèi)容便不能進入全屏模式泼差。
onShowCustomView(View view, WebChromeClient.CustomViewCallback callback):該方法在當前頁面進入全屏模式時回調(diào),主程序必須提供一個包含當前web內(nèi)容(視頻 or Something)的自定義的View呵俏。
onHideCustomView():該方法在當前頁面退出全屏模式時回調(diào)堆缘,主程序應(yīng)在這時隱藏之前show出來的View。
Bitmap getDefaultVideoPoster():當我們的Web頁面包含視頻時普碎,我們可以在HTML里為它設(shè)置一個預(yù)覽圖吼肥,WebView會在繪制頁面時根據(jù)它的寬高為它布局。而當我們處于弱網(wǎng)狀態(tài)下時麻车,我們沒有比較快的獲取該圖片缀皱,那WebView繪制頁面時的gitWidth()方法就會報出空指針異常~ 于是app就crash了。动猬。
這時我們就需要重寫該方法啤斗,在我們尚未獲取web頁面上的video預(yù)覽圖時,給予它一個本地的圖片赁咙,避免空指針的發(fā)生钮莲。
View getVideoLoadingProgressView():重寫該方法可以在視頻loading時給予一個自定義的View,可以是加載圓環(huán) or something序目。
boolean onJsAlert(WebView view, String url, String message, JsResult result):處理Javascript中的Alert對話框。
boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result):處理Javascript中的Prompt對話框伯襟。
boolean onJsConfirm(WebView view, String url, String message, JsResult result):處理Javascript中的Confirm對話框
boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, WebChromeClient.FileChooserParams fileChooserParams):該方法在用戶進行了web上某個需要上傳文件的操作時回調(diào)猿涨。我們應(yīng)該在這里打開一個文件選擇器,如果要取消這個請求我們可以調(diào)用filePathCallback.onReceiveValue(null)并返回true姆怪。
onPermissionRequest(PermissionRequest request):該方法在web頁面請求某個尚未被允許或拒絕的權(quán)限時回調(diào)叛赚,主程序在此時調(diào)用grant(String [])或deny()方法澡绩。如果該方法沒有被重寫,則默認拒絕web頁面請求的權(quán)限俺附。
onPermissionRequestCanceled(PermissionRequest request):該方法在web權(quán)限申請權(quán)限被取消時回調(diào)肥卡,這時應(yīng)該隱藏任何與之相關(guān)的UI界面。