首页 > 代码库 > 简谈WebViewClient与WebChromeClient
简谈WebViewClient与WebChromeClient
简介:WebViewClient被用来传递单纯的加载一个链接时所发生的事件,比如开始加载,结束加载等,它代表这个链接加载时的最普通的和最笼统的事件,WebChromeClient更多的是传递JS对话框,上传文件,网页的标题改变等网页内元素的事件。
一,WebViewClient
- API列表:
?void | doUpdateVisitedHistory(WebView view, String url, boolean isReload) 知主机应用程序来更新其访问过的链接数据库。 |
void | onFormResubmission(WebView view, Message dontResend, Message resend) 作为主机的应用程序,如果在浏览器应该重新发送的数据作为所请求的页是一个POST的结果。 |
void | onLoadResource(WebView view, String url) 通知主机应用程序的web视图将加载由给定的URL指定的资源。 |
void | onPageFinished(WebView view, String url) 通知主机应用程序页面加载完成。 |
void | onPageStarted(WebView view, String url, Bitmap favicon) 通知主机应用程序一个页面已经开始加载。 |
void | onReceivedClientCertRequest(WebView view, ClientCertRequest request) 通知主机应用程序来处理SSL客户端证书请求。 |
void | onReceivedError(WebView view, int errorCode, String description, String failingUrl) 报告错误到主机应用程序。 |
void | onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) 通知主机应用程序WebView接收到一个HTTP验证请求 |
void | onReceivedLoginRequest(WebView view, String realm, String account, String args) 通知主机应用程序一个登陆请求已经被处理 |
void | onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) 通知主机应用程序在加载资源是发生了一个SSL 错误 |
void | onScaleChanged(WebView view, float oldScale, float newScale) 通知主机应用程序WebView的缩放状态已经被改变 |
void | onTooManyRedirects(WebView view, Message cancelMsg, Message continueMsg) 这个方法在API8的时候被遗弃。这个方法已经不再被调用,当WebView遇到一个重定向的循环操作,它会取消这个操作 |
void | onUnhandledInputEvent(WebView view, InputEvent event) 通知主机应用程序一个键盘输入事件没有被WebView传递 |
void | onUnhandledKeyEvent(WebView view, KeyEvent event) 这个方法在API 21的时候被遗弃,它被归入onUnhandledKeyEvent。 |
WebResourceResponse | shouldInterceptRequest(WebView view, WebResourceRequest request) 通知主机应用程序有个一个资源请求然后允许应用程序返回数据 |
WebResourceResponse | shouldInterceptRequest(WebView view, String url) 这个方法在API 21 的时候被遗弃,使用 |
boolean | shouldOverrideKeyEvent(WebView view, KeyEvent event) 给主机应用程序提供一个机会去传递键盘同步事件 |
boolean | shouldOverrideUrlLoading(WebView view, String url) 给主机应用程序提供一个机会去控制当前WebView将要被加载的新的url |
2. 下面介绍下几个简单的应用:
- 使用我们自己的WebView加载页面上的链接
当用户点击一个网页上的连接时,默认的操作是另外打开一个与之相关的应用然后传递URL,通常是打开我们系统默认的浏览器然后加载目标URL地址。 但是我们可以重新定义这个操作既使用我们自己的WebView打开打开这个URL,你还可以通过他们的浏览历史允许用户导航向前像后。能够到达上面的效 果西需要我们提供一个自己的WebView,然后适用setWebViewClient()
WebView webview = f(WebView)indViewById(R.id.webview);webview.setWebViewClient(new WebViewClient());
这个运行用户使用你自己的WebView加载链接
如果想要在点击一个连接后获取到更多的控制,需要我们创建我们自己的WebClient,然后重写shouldOverrideUrlLoading() 方法,
例如:我们如果点击的我链接是我自己的就用我们自己的WebView加载,如果是别的链接就用别的应用打开
private class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (Uri.parse(url).getHost().equals("www.example.com")) { // This is my web site, so do not override; let my WebView load the page return false; } // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); return true; }}
然后:
WebView myWebView = (WebView) findViewById(R.id.webview);myWebView.setWebViewClient(new MyWebViewClient());
showOverrideUrlLoading的返回值为false时代表我们自己的WebView会处理这个链接,如果为true代表会传递给系统做相应的处理(如:提供一些能够处理这个连接的应用让你选择)
- 导航网页浏览历史
当我们重写URL加载时,它会自动的累计你的网页浏览历史,你可以通过goBack()和goForward()向前或者向后导航。
例如:我们的Activity使用返回键处理返回导航
@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) { // Check if the key event was the Back button and if there‘s history if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) { myWebView.goBack(); return true; } // If it wasn‘t the Back key or there‘s no web page history, bubble up to the default // system behavior (probably exit the activity) return super.onKeyDown(keyCode, event);}
如果不进行这个检查,当用户已经浏览器完所有的历史之后goBack()和goForward()将不起任何作用。
简谈WebViewClient与WebChromeClient