好多朋友會在Android開發(fā)過程中遇到使用WebView加載html頁面出現(xiàn)404,500等錯(cuò)誤頁面督函,也有好多人想自定義這個(gè)錯(cuò)誤頁面嘀粱,但是在6.0之前激挪,大家覺得自定義錯(cuò)誤頁面就不好處理了;
之前一直使用在WebView加載時(shí)锋叨,根據(jù)onReceivedError() 判斷網(wǎng)頁是否加載成功垄分,然后做相應(yīng)的操作,但是最后發(fā)現(xiàn)娃磺,在一些情況下薄湿,html頁面加載失敗了,onReceivedError()方法卻并沒有執(zhí)行偷卧。
最后進(jìn)過努力豺瘤,想出了一個(gè)比較笨,但是我又覺得比較有效的方法涯冠。下面來給大家簡單說一說:
不知道大家發(fā)現(xiàn)沒有炉奴,在所有的加載錯(cuò)誤的html頁面中逼庞,html的標(biāo)題title可能都會包含錯(cuò)誤信息蛇更,比如說“error”,這樣的話我們就可以在這個(gè)html的標(biāo)題title上做文章了赛糟。
1.先給大家說說怎么獲取這個(gè)html的標(biāo)題title
(1).Android應(yīng)用開發(fā)的時(shí)候使用WebView這個(gè)組件的過程中可能會接觸到WebViewClient與WebChromeClient派任,那么這兩個(gè)類到底有什么不同呢
WebViewClient主要幫助WebView處理各種通知、請求事件的璧南,比如:
onLoadResource
onPageStart
onPageFinish
onReceiveError
onReceivedHttpAuthRequest
WebChromeClient主要輔助WebView處理Javascript的對話框掌逛、網(wǎng)站圖標(biāo)、網(wǎng)站title司倚、加載進(jìn)度等比如
onCloseWindow(關(guān)閉WebView)
onCreateWindow()
onJsAlert (WebView上alert無效豆混,需要定制WebChromeClient處理彈出)
onJsPrompt
onJsConfirm
onProgressChanged
onReceivedIcon
onReceivedTitle
看上去他們有很多不同,實(shí)際使用的話动知,如果你的WebView只是用來處理一些html的頁面內(nèi)容皿伺,只用WebViewClient就行了,如果需要更豐富的處理效果盒粮,
比如JS鸵鸥、進(jìn)度條等,就要用到WebChromeClient丹皱。
(2).我們可以看到在 WebChromeClient 中有一個(gè)方法 onReceivedTitle() 妒穴,這個(gè)方法就是用來獲取html頁面的標(biāo)題title的回調(diào)。
2.我們在 WebChromeClient 中的 onReceivedTitle() 方法里判斷html頁面的標(biāo)題中是否含有 “error” 摊崭,如果有讼油,則證明html加載失敗,設(shè)置加載失敗的標(biāo)記呢簸,讓在 WebViewClient 的完成是回
調(diào)的 onPageFinish() 方法里顯示自定義的加載失敗的頁面**
代碼如下:
WebSettings webSettings = webView.getSettings();
//設(shè)置WebView屬性矮台,能夠執(zhí)行Javascript腳本
webSettings.setJavaScriptEnabled(true);
//設(shè)置可以訪問文件
webSettings.setAllowFileAccess(true);
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
/**
* 網(wǎng)頁頁面開始加載的時(shí)候淆攻,執(zhí)行的回調(diào)方法
* @param view
* @param url
* @param favicon
*/
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {//網(wǎng)頁頁面開始加載的時(shí)候
emptyView.setEmptyView(EmptyView.EMPTY_LOADING);//初始化一個(gè)顯示正在加載的視圖
rl_detail.setVisibility(View.VISIBLE);
rl_detail.removeAllViews();
rl_detail.addView(emptyView);//在加載頁面開始的時(shí)候顯示一個(gè)正在加載的視圖,
webView.setEnabled(false);// 當(dāng)加載網(wǎng)頁的時(shí)候?qū)⒕W(wǎng)頁進(jìn)行隱藏
ll_container_btn.setVisibility(View.GONE);
btn_collect.setVisibility(View.GONE);
super.onPageStarted(view, url, favicon);
}
/**
* 網(wǎng)頁加載結(jié)束的時(shí)候執(zhí)行的回調(diào)方法
* @param view
* @param url
*/
@Override
public void onPageFinished(WebView view, String url) {//網(wǎng)頁加載結(jié)束的時(shí)候
if (!loadError) {//當(dāng)網(wǎng)頁加載成功的時(shí)候判斷是否加載成功
rl_detail.setVisibility(View.GONE);//加載成功的話嘿架,則隱藏掉顯示正在加載的視圖瓶珊,顯示加載了網(wǎng)頁內(nèi)容的WebView
webView.setEnabled(true);
ll_container_btn.setVisibility(View.VISIBLE);
btn_collect.setVisibility(View.VISIBLE);
} else { //加載失敗的話,初始化頁面加載失敗的圖耸彪,然后替換正在加載的視圖頁面
rl_detail.removeAllViews();
emptyView.setEmptyView(EmptyView.EMPTY_EMPTY, "您找的頁面暫時(shí)走丟了...");
rl_detail.addView(emptyView);
}
}
/**
* 頁面加載錯(cuò)誤時(shí)執(zhí)行的方法伞芹,但是在6.0以下,有時(shí)候會不執(zhí)行這個(gè)方法
* @param view
* @param errorCode
* @param description
* @param failingUrl
*/
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
loadError = true;
}
});
webView.setWebChromeClient(new WebChromeClient(){
/**
* 當(dāng)WebView加載之后蝉娜,返回 HTML 頁面的標(biāo)題 Title
* @param view
* @param title
*/
@Override
public void onReceivedTitle(WebView view, String title) {
//判斷標(biāo)題 title 中是否包含有“error”字段唱较,如果包含“error”字段,則設(shè)置加載失敗召川,顯示加載失敗的視圖
if(!TextUtils.isEmpty(title)&&title.toLowerCase().contains("error")){
loadError = true;
}
}
});
webView.loadUrl(url);
源碼下載 源碼下載