Android WebView自定义处理错误页面显示(404等)

关键代码以下:

[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或其他服务器会返回其他的错误信息,这个我也要意义检测,不光慢,也不科学。

本人经验有限,技术拙漏,薄文仅供参考。欢迎批评指正 

时间: 2024-10-07 07:36:49

Android WebView自定义处理错误页面显示(404等)的相关文章

关闭iis 错误页面显示详细内容

关闭iis 错误页面显示详细内容,为安全起见,防止黑客通过iis错误信息获取有用信息,隐藏iis错误页面的详细形象 打开iis功能视图,打开 错误页点击编辑功能设置默认为 详细错误 选择自定义错误

安全配置,关闭iis 错误页面显示详细内容

为web安全,防止黑客通过web错误页面信息获取有用信息,关闭iis 错误页面显示详细内容 1.打开iis功能视图,打开 错误页点击编辑功能设置默认为 详细错误选择自定义错误

Android WebView自定义错误页面笔记

需求: WebView加载H5页面遇到错误时,需要修改系统默认的页面,采用自己定制的页面. 解决方案与过程: 1.最开始采用的是webView.loadDataWithBaseUrl加载一段字符串: String data="<a onClick=\"window.history.back()\" >页面错误,点击刷新</a>"; mWebView.loadDataWithBaseURL("", data, "t

springboot实现自定义的错误页面展示

https://blog.csdn.net/trusause/article/details/84299886 参考 SpringBoot默认的错误处理机制 默认效果为: 返回一个默认的错误页面 Whitelabel Error Page 这里使用这个类: package com.c23i23l.c123.config; import org.springframework.boot.web.server.ErrorPage; import org.springframework.boot.we

tomcat访问页面显示404错误

Web项目配置好后,部署到tomcat中运行,访问jsp页面(包括静态页面)一直出现404错误,404错误属于路径错误,但是反复查看jsp页面在项目中的位置,没有问题,访问路径为:http://localhost:8080/项目名称/index.jsp. 在网上查了许多资料,才发现问题出在Run/Debug Configuration 中. 原配置: 我在Application Context中设置为"/",因此访问路径应该为:http://localhost:8080/index.j

[android] WebView自定义浏览器

在布局文件中添加<EditText/>和<Button/>控件, 在布局文件中添加<WebView/>控件 在Activity中获取WebView对象 调用WebView对象的loadUrl()方法,参数:String路径 添加访问网络的权限android.permission.INTERNET 调用WebView对象的getSettings()方法,获取到WebSettings设置对象 调用WebSettings对象的setSupportZoom()方法,设置支持缩放

通过代码自定义cell 新浪微博页面显示

通过代码自定义cell(cell的高度不一致)(如果高度一致的cell 用xib实现) 1.新建一个集成自UItableVIewCell的类 2.重写initWithStle :方法 1 - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 1>添加所有需要显示的子控件(不需要设置子控件的数据和Frame,子控件要添加到contentView中)

Android Studio自定义模板 写页面竟然可以如此轻松

本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发. 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/51635533: 本文出自:[张鸿洋的博客] 1.概述 上一篇文章,已经初步对Android Studio的模板有了初步的介绍与使用,以及一些开源模板的推荐: 神奇的Android Studio Template 本文将对如何编写Template,进行详细的介绍(以activity摸版为例)

自定义 404 与 500 错误页面,URL 地址不会重定向。

对于 404 与 500 错误发生时,我们希望自己定义一个更加人性化的页面. 例子 当访问下面这个地址时: http://localhost/aaaa/bbb/ccc/ddd/eee/fff/ggg 浏览器的 URL 不变,依然是 http://localhost/aaaa/bbb/ccc/ddd/eee/fff/ggg 但页面显示的是我们自定义的错误页面. 一.在 web.config 里增加以下节点. <system.webServer> <httpErrors errorMode=