自定义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); 3 webView.getSettings().setSupportMultipleWindows(true); 4 webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); 5 webView.setWebChromeClient(new WebChromeClient() 6 { 7 public void onProgressChanged(WebView view, int progress) 8 { 9 activity.setProgress(progress * 100); 10 if(progress >= 99){ 11 new Thread(new Runnable() { 12 @Override 13 public void run() { 14 Message msg=handler.obtainMessage(); 15 msg.what=2;//隐藏加载框 16 handler.sendMessage(msg); 17 } 18 }).start(); 19 activity.setTitle(R.string.app_name); 20 } 21 } 22 }); 23 24 webView.setWebViewClient(new WebViewClient() { 25 public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) 26 { 27 Message msg=handler.obtainMessage();//发送通知,加入线程 28 msg.what=1;//通知加载自定义404页面 29 handler.sendMessage(msg);//通知发送! 30 } 31 public boolean shouldOverrideUrlLoading(WebView view, String url) 32 { 33 view.loadUrl(url); 34 return true; 35 } 36 }); 37 38 webView.addJavascriptInterface(this, "javatojs"); 39 webView.loadUrl(URL); 40 } 41 /** 42 * handler处理消息机制 43 */ 44 protected Handler handler = new Handler(){ 45 public void handleMessage(Message message){ 46 switch (message.what) { 47 case 0: 48 myDialog.show(); 49 break; 50 case 1: 51 webView.loadUrl("file:///android_asset/404.html"); 52 break; 53 case 2: 54 myDialog.dismiss(); 55 break; 56 } 57 } 58 };
说明:虽说这两个方法都是系统内置方法,但是连用起来还是会出现短暂的跳转,跳转的一瞬间会看到原有的404错误页面。我了解过其他文章的分析,部分文章认为这是因为webview加载页面是通过两个线程进行的,所以当我们收到错误消息的时候另外一个线程可能就将原先的页面显示出来了。所以会有一点“闪”。
在使用这个方法之前我也想过其他的加载自定义界面,比如在页面加载到大于99%的时候,我检测webview的title,如果是null或“未找到页面(不同的手机可能提示的不一样)”就跳转到自定义的错误界面,同样也会出现短暂的闪出原404界面。
当我找到文章刚开始的方法之后果断把这个方法舍去了,因为不同手机的提示是不一样的,而且有时候tomcat或其他服务器会返回其他的错误信息,这个我也要意义检测,不光慢,也不科学。