Android WebView自訂處理錯誤頁面顯示(404等)

來源:互聯網
上載者:User

標籤:des   android   style   blog   http   color   os   使用   io   

關鍵代碼以下:

[java] view plaincopyprint?

  1. @Override  

  2. public void onReceivedError(WebView view, int errorCode,  

  3.     String description, String failingUrl) {  

  4.     //用javascript隱藏系統定義的404頁面資訊  

  5.     String data = "Page NO FOUND!";  

  6.     view.loadUrl("javascript:document.body.innerHTML=\"" + data + "\"");  

  7. }  


本文原創,轉載請註明出處: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等)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.