首页 > 代码库 > 简谈WebViewClient与WebChromeClient

简谈WebViewClient与WebChromeClient

简介:WebViewClient被用来传递单纯的加载一个链接时所发生的事件,比如开始加载,结束加载等,它代表这个链接加载时的最普通的和最笼统的事件,WebChromeClient更多的是传递JS对话框,上传文件,网页的标题改变等网页内元素的事件。


 

 

 一,WebViewClient

  1. API列表:
 
?voiddoUpdateVisitedHistory(WebView view, String url, boolean isReload)

知主机应用程序来更新其访问过的链接数据库。

voidonFormResubmission(WebView view, Message dontResend, Message resend)

作为主机的应用程序,如果在浏览器应该重新发送的数据作为所请求的页是一个POST的结果。

voidonLoadResource(WebView view, String url)

通知主机应用程序的web视图将加载由给定的URL指定的资源。

voidonPageFinished(WebView view, String url)

通知主机应用程序页面加载完成。

voidonPageStarted(WebView view, String url, Bitmap favicon)

通知主机应用程序一个页面已经开始加载。

voidonReceivedClientCertRequest(WebView view, ClientCertRequest request)

通知主机应用程序来处理SSL客户端证书请求。

voidonReceivedError(WebView view, int errorCode, String description, String failingUrl)

报告错误到主机应用程序。

voidonReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm)

通知主机应用程序WebView接收到一个HTTP验证请求

voidonReceivedLoginRequest(WebView view, String realm, String account, String args)

通知主机应用程序一个登陆请求已经被处理

voidonReceivedSslError(WebView view, SslErrorHandler handler, SslError error)

通知主机应用程序在加载资源是发生了一个SSL 错误

voidonScaleChanged(WebView view, float oldScale, float newScale)

通知主机应用程序WebView的缩放状态已经被改变

voidonTooManyRedirects(WebView view, Message cancelMsg, Message continueMsg)

这个方法在API8的时候被遗弃。这个方法已经不再被调用,当WebView遇到一个重定向的循环操作,它会取消这个操作

voidonUnhandledInputEvent(WebView view, InputEvent event)

通知主机应用程序一个键盘输入事件没有被WebView传递

voidonUnhandledKeyEvent(WebView view, KeyEvent event)

这个方法在API 21的时候被遗弃,它被归入onUnhandledKeyEvent。

WebResourceResponseshouldInterceptRequest(WebView view, WebResourceRequest request)

通知主机应用程序有个一个资源请求然后允许应用程序返回数据

WebResourceResponseshouldInterceptRequest(WebView view, String url)

这个方法在API 21 的时候被遗弃,使用shouldInterceptRequest代替

booleanshouldOverrideKeyEvent(WebView view, KeyEvent event)

给主机应用程序提供一个机会去传递键盘同步事件

booleanshouldOverrideUrlLoading(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