標籤:des android style blog http color os 使用 io
關鍵代碼以下:
[java] view plaincopyprint?
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
//用javascript隱藏系統定義的404頁面資訊
String data = "Page NO FOUND!";
view.loadUrl("javascript:document.body.innerHTML=\"" + data + "\"");
}
本文原創,轉載請註明出處:http://blog.csdn.net/feifei454498130/article/details/23627557
主要是在WebViewClient裡,重載OnReceivedError的方法,然後通過javascript操作dom去改變內容。
而網上大多數的處理方式是view.loadUrl(指向一個assets目錄下的html檔案或者"about:blank"),這樣處理的話,在重新重新整理時就會重新整理當前這個錯誤的頁面,或者在處理goBack()時候會出現一些問題。而通過以上方式則可以避免相應的問題。
自訂404頁面。android的webview 控制項可以載入網頁,webview有兩個方法:webView.setWebChromeClient和webView.setWebViewClient。
WebChromeClient主要處理解析,渲染網頁等瀏覽器做的事情,輔助WebView處理Javascript的對話方塊,網站表徵圖,網站title,載入進度:
onCloseWindow(關閉WebView)
onCreateWindow()
onJsAlert (WebView上alert是彈不出來東西的,需要定製你的WebChromeClient處理彈出)
onJsPrompt
onJsConfirm
onProgressChanged
onReceivedIcon
onReceivedTitle
比如可以添加進度條,使得介面更友好。
WebViewClient是協助WebView處理各種通知、請求事件的,具體來說包括:
onLoadResource
onPageStart
onPageFinish
onReceiveError //這個就是我們想要的方法
onReceivedHttpAuthRequest
那麼我們要載入自訂的404介面就要兩個並用了。
代碼如下:
1 webView = (WebView) findViewById(R.id.webv);//擷取控制項 2 webView.getSettings().setJavaScriptEnabled(true); //設定js許可權,比如js彈出窗,你懂得 3 webView.getSettings().setSupportMultipleWindows(true); 4 5 webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); 6 7 webView.setWebChromeClient(new MyWebChromeClient() 8 { 9 public void onProgressChanged(WebView view, int progress)//設定 載入進程10 {11 activity.setTitle("正在載入...Loading...");12 activity.setProgress(progress * 100);13 if(progress >= 100){14 new Thread(new Runnable() {15 @Override16 public void run() {17 Message msg=handler.obtainMessage();//發送通知,加入線程18 msg.what=2;//載入完成19 handler.sendMessage(msg);//通知發送!20 } 21 }).start(); 22 activity.setTitle(R.string.app_name);23 }24 }25 }26 );27 28 webView.setWebViewClient(new WebViewClient() {29 public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) 30 { 31 view.stopLoading();32 view.clearView();33 Message msg=handler.obtainMessage();//發送通知,加入線程34 msg.what=1;//通知載入自訂404頁面35 handler.sendMessage(msg);//通知發送!36 }37 public boolean shouldOverrideUrlLoading(WebView view, String url) 38 {39 view.loadUrl(url);40 return true;41 }42 });43 webView.addJavascriptInterface(this, "javatojs");//將本activity綁定到java_js這個js當中去44 webView.loadUrl(URL);45 checkUPPay();//檢測銀聯支付控制項是否已添加46 }47 /**48 * handler處理訊息機制49 */50 protected Handler handler = new Handler(){51 public void handleMessage(Message message){52 switch (message.what) {53 case 0:54 myDialog.show();55 break;56 case 1:57 webView.loadUrl(URL404);58 break;59 case 2:60 myDialog.dismiss();61 break;62 }63 }64 };
說明:雖說這兩個方法都是系統內建方法,但是連用起來還是會出現短暫的跳轉,跳轉的一瞬間會看到原有的404錯誤頁面。我瞭解過其他文章的分析,部分文章認為這是因為webview載入頁面是通過兩個線程進行的,所以當我們收到錯誤訊息的時候另外一個線程可能就將原先的頁面顯示出來了。所以會有一點“閃”。
在使用這個方法之前我也想過其他的載入自訂介面,比如在頁面載入到大於99%的時候,我檢測webview的title,如果是null或“未找到頁面(不同的手機可能提示的不一樣)”就跳轉到自訂的錯誤介面,同樣也會出現短暫的閃出原404介面。
當我找到文章剛開始的方法之後果斷把這個方法捨去了,因為不同手機的提示是不一樣的,而且有時候tomcat或其他伺服器會返回其他的錯誤資訊,這個我也要意義檢測,不光慢,也不科學。
本人經驗有限,技術拙漏,薄文僅供參考。歡迎批評指正
Android WebView自訂處理錯誤頁面顯示(404等)