简谈WebViewClient与WebChromeClient

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


 

 

 一,WebViewClient

  1. 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 的时候被遗弃,使用shouldInterceptRequest代替

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使用返回键处理返回导航

@Override
public 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()将不起任何作用。

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。