setWebViewClient和setWebChromeClient有什么区别?

Android中的setWebViewClientsetWebChromeClient什么不同?

从源代码 :

 // Instance of WebViewClient that is the client callback. private volatile WebViewClient mWebViewClient; // Instance of WebChromeClient for handling all chrome functions. private volatile WebChromeClient mWebChromeClient; // SOME OTHER SUTFFF....... /** * Set the WebViewClient. * @param client An implementation of WebViewClient. */ public void setWebViewClient(WebViewClient client) { mWebViewClient = client; } /** * Set the WebChromeClient. * @param client An implementation of WebChromeClient. */ public void setWebChromeClient(WebChromeClient client) { mWebChromeClient = client; } 

使用WebChromeClient允许您处理Javascript对话框,网站图标,标题和进度。 看一下这个例子: 向WebView添加alert()支持

乍看之下, WebViewClient和WebChromeClient的差别太大了。 但是,基本上:如果您正在开发不需要太多function但呈现HTML的WebView,则可以使用WebViewClient 。 另一方面,如果您想(例如)加载正在呈现的页面的图标,则应使用WebChromeClient对象并覆盖onReceivedIcon(WebView view, Bitmap icon)

大多数情况下,如果你不想担心这些事情,你可以这样做:

 webView= (WebView) findViewById(R.id.webview); webView.setWebChromeClient(new WebChromeClient()); webView.setWebViewClient(new WebViewClient()); webView.getSettings().setJavaScriptEnabled(true); webView.loadUrl(url); 

而且你的WebView(理论上)将实现所有的function(如android原生浏览器)。

我觉得这个问题需要更多的细节。 我的答案是从Android编程,书呆子牧场指南(第二版)的启发。

默认情况下 ,WebView中的JavaScript已closures。 您并不总是需要启用它,但对于某些应用程序,可能需要它。

加载URL必须在configurationWebView之后完成,所以你最后一次做。 在此之前,您可以通过调用getSettings()来打开JavaScript以获取WebSettings的实例,并调用WebSettings.setJavaScriptEnabled(true) 。 WebSettings是您可以修改WebView的三种方法中的第一种。 它具有可以设置的各种属性,如用户代理string和文本大小。

之后,您configuration您的WebViewClient。 WebViewClient是一个事件接口。 通过提供您自己的WebViewClient实现,您可以响应呈现事件。 例如,您可以检测呈现器何时开始从特定URL加载图像,或者决定是否重新提交POST请求到服务器。

WebViewClient有许多方法可以覆盖,其中大部分不会涉及到。 但是,您确实需要replace默认的WebViewClient的shouldOverrideUrlLoading(WebView, String) 。 此方法确定在WebView中加载新URL时会发生什么情况,例如通过按下链接。 如果返回true,则表示“不处理这个URL,我正在处理它”。如果你返回false,你说:“继续并加载这个URL,WebView,我没有做任何事情“。

默认的实现会引发一个隐含的意图,就像你之前做的那样。 但现在,这将是一个严重的问题。 某些Web应用程序所做的第一件事是将您redirect到网站的移动版本。 使用默认的WebViewClient,这意味着您立即被发送到用户的默认Web浏览器。 这正是你想要避免的。 修复很简单 – 只需重写默认实现并返回false。

使用WebChromeClient来修饰事物由于您正在花时间创build自己的WebView,我们通过添加一个进度条并使用加载页面的标题来更新工具栏的副标题来修饰它。

要连接ProgressBar,您将在WebView上使用第二个callback:WebChromeClient。

WebViewClient是一个响应渲染事件的接口; WebChromeClient是一个事件接口,用于对事件进行反应,这些事件会改变浏览器周围的铬的元素。 这包括JavaScript警报,网站图标,当然还有更新加载进度和当前页面的标题。

挂钩在onCreateView(…) 。 使用WebChromeClient来更新云进程更新和标题更新都有自己的callback方法onProgressChanged(WebView, int)onReceivedTitle(WebView, String) 。 您从onProgressChanged(WebView, int)收到的进度是一个从0到100的整数。如果它是100,那么您知道页面已完成加载,因此通过将ProgressBar的可见性设置为View.GONE来隐藏ProgressBar。

免责声明:本信息取自作者许可下的Android Programming:The Big Nerd Ranch Guide。 有关本书的更多信息或购买副本,请访问bignerdranch.com。