控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

android webview 自定义404错误页面!

作者:未知 出处:cnblog 2012年10月25日 阅读:

自定义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界面就要两个并用了。

代码如下:

  webView = (WebView) findViewById(R.id.webv);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setSupportMultipleWindows(true);
         webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
         webView.setWebChromeClient(new WebChromeClient()
         {        
             public void onProgressChanged(WebView view, int progress)
              {
                 activity.setProgress(progress * 100);
                 if(progress >= 99){
                     new Thread(new Runnable() {
                         @Override
                         public void run() {
                                    Message msg=handler.obtainMessage();
                                    msg.what=2;//隐藏加载框
                                     handler.sendMessage(msg);
                                 }
                   }).start(); 
                    activity.setTitle(R.string.app_name);
                 }
             }
        });
 
         webView.setWebViewClient(new WebViewClient() {
             public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)   
             {
               Message msg=handler.obtainMessage();//发送通知,加入线程
                msg.what=1;//通知加载自定义404页面
                handler.sendMessage(msg);//通知发送!
             }
             public boolean shouldOverrideUrlLoading(WebView view, String url) 
             {
                 view.loadUrl(url);
                 return true;
                 }
             });
        
         webView.addJavascriptInterface(this, "javatojs");
         webView.loadUrl(URL);
     }
     /**
      * handler处理消息机制
      */
         protected Handler handler = new Handler(){
             public void handleMessage(Message message){
                 switch (message.what) {
                 case 0:
                     myDialog.show();
                     break;
                case 1:
                     webView.loadUrl("file:///android_asset/404.html");
                     break;
                 case 2:
                     myDialog.dismiss();
                     break;
                 }
             }
         };
 

说明:虽说这两个方法都是系统内置方法,但是连用起来还是会出现短暂的跳转,跳转的一瞬间会看到原有的404错误页面。我了解过其他文章的分析,部分文章认为这是因为webview加载页面是通过两个线程进行的,所以当我们收到错误消息的时候另外一个线程可能就将原先的页面显示出来了。所以会有一点“闪”。

在使用这个方法之前我也想过其他的加载自定义界面,比如在页面加载到大于99%的时候,我检测webview的title,如果是null或“未找到页面(不同的手机可能提示的不一样)”就跳转到自定义的错误界面,同样也会出现短暂的闪出原404界面。

当我找到文章刚开始的方法之后果断把这个方法舍去了,因为不同手机的提示是不一样的,而且有时候tomcat或其他服务器会返回其他的错误信息,这个我也要意义检测,不光慢,也不科学。

 

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统