關鍵代碼如下:javascript
[java] view plaincopyprint?html
@Override java
public void onReceivedError(WebView view, int errorCode, android
String description, String failingUrl) { web
//用javascript隱藏系統定義的404頁面信息 瀏覽器
String data = "Page NO FOUND!"; tomcat
view.loadUrl("javascript:document.body.innerHTML=\"" + data + "\""); 服務器
} app
本文原創,轉載請註明出處:http://blog.csdn.net/feifei454498130/article/details/23627557dom
主要是在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或其餘服務器會返回其餘的錯誤信息,這個我也要意義檢測,不光慢,也不科學。
本人經驗有限,技術拙漏,薄文僅供參考。歡迎批評指正