android webview 自定義404錯誤頁面!


自定義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                             @Override
16                             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或其他服務器會返回其他的錯誤信息,這個我也要意義檢測,不光慢,也不科學。

本人經驗有限,技術拙漏,薄文僅供參考。歡迎批評指正 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM