setWebViewClient 与 setWebChromeClient 有啥区别?

Posted

技术标签:

【中文标题】setWebViewClient 与 setWebChromeClient 有啥区别?【英文标题】:What's the difference between setWebViewClient vs. setWebChromeClient?setWebViewClient 与 setWebChromeClient 有什么区别? 【发布时间】:2011-02-19 14:29:03 【问题描述】:

setWebViewClientandroid 中的setWebChromeClient 有什么区别?

【问题讨论】:

我添加了更多信息 【参考方案1】:

来自source code:

// 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 对话框、网站图标、标题和进度。看看这个例子:Adding alert() support to a WebView

乍一看,WebViewClient & WebChromeClient 的区别太多了。但是,基本上:如果您正在开发一个不需要太多功能但呈现 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 将(理论上)实现所有功能(作为 android 原生浏览器)。

【讨论】:

这种形式的答案是不完整的。 ChromeClient 允许处理枚举的东西,但 ViewClient 是什么,有什么异同? 这种方法是否有助于改善默认 webview 的一些不良功能?特别是对于 css3 动画和过渡? 我可以同时使用它们吗? @SergeyDirin:***.com/a/6475858。参考这个答案,你可以同时使用两者。 如果没有chrome,如何在webviewclient中处理相机权限?【参考方案2】:

我觉得这个问题需要更多细节。我的回答灵感来自 Android Programming, The Big Nerd Ranch Guide (2nd edition)。

默认情况下,JavaScript 在 WebView 中处于关闭状态。您并不总是需要打开它,但对于某些应用程序,可能确实需要它。

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

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

WebViewClient 有许多可以覆盖的方法,其中大部分你不会处理。但是,您确实需要替换默认 WebViewClient 的 shouldOverrideUrlLoading(WebView, String) 实现。此方法确定在 WebView 中加载新 URL 时会发生什么,例如按下链接。如果你返回 true,你是在说,“不要处理这个 URL,我自己处理它。”如果你返回 false,你是在说,“继续加载这个 URL,WebView,我没有用它做任何事情。”

默认实现会触发带有 URL 的隐式意图,就像您之前所做的那样。不过,现在这将是一个严重的问题。一些 Web 应用程序所做的第一件事就是将您重定向到网站的移动版本。使用默认的 WebViewClient,这意味着您会立即被发送到用户的默认 Web 浏览器。这正是您要避免的。 修复很简单——只需覆盖默认实现并返回 false。

使用 WebChromeClient 进行修饰 由于您正在花时间创建自己的 WebView,让我们通过添加进度条并使用加载页面的标题更新工具栏的副标题来对其进行一些修饰。

要连接 ProgressBar,您将使用 WebView 上的第二个回调:WebChromeClient

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

连接到onCreateView(…)。使用 WebChromeClient 修饰事物 进度更新和标题更新各有自己的回调方法, onProgressChanged(WebView, int)onReceivedTitle(WebView, String)。你从onProgressChanged(WebView, int)收到的进度是0到100之间的一个整数。如果是100,你知道 页面已完成加载,因此您可以通过将其可见性设置为 View.GONE 来隐藏 ProgressBar。

免责声明:此信息摘自 Android 编程:大书呆子牧场指南,并获得了作者的许可。更多 有关本书的信息或购买副本,请访问 bignerdranch.com。

【讨论】:

我认为这是一个比公认的更好的答案。【参考方案3】:

如果你想从网页记录错误,你应该使用WebChromeClient并覆盖它的onConsoleMessage

webView.settings.apply 
    javaScriptEnabled = true
    javaScriptCanOpenWindowsAutomatically = true
    domStorageEnabled = true

webView.webViewClient = WebViewClient()
webView.webChromeClient = MyWebChromeClient()

private class MyWebChromeClient : WebChromeClient() 
    override fun onConsoleMessage(consoleMessage: ConsoleMessage): Boolean 
        Timber.d("$consoleMessage.message()")
        Timber.d("$consoleMessage.lineNumber() $consoleMessage.sourceId()")
        return super.onConsoleMessage(consoleMessage)
    

【讨论】:

【参考方案4】:

WebViewClient 提供以下回调方法,您可以通过这些方法干扰WebView 如何转换到下一个内容

void doUpdateVisitedHistory (WebView view, String url, boolean isReload)
void onFormResubmission (WebView view, Message dontResend, Message resend)
void onLoadResource (WebView view, String url)
void onPageCommitVisible (WebView view, String url)
void onPageFinished (WebView view, String url)
void onPageStarted (WebView view, String url, Bitmap favicon)
void onReceivedClientCertRequest (WebView view, ClientCertRequest request)
void onReceivedError (WebView view, int errorCode, String description, String failingUrl)
void onReceivedError (WebView view, WebResourceRequest request, WebResourceError error)
void onReceivedHttpAuthRequest (WebView view, HttpAuthHandler handler, String host, String realm)
void onReceivedHttpError (WebView view, WebResourceRequest request, WebResourceResponse errorResponse)
void onReceivedLoginRequest (WebView view, String realm, String account, String args)
void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error)
boolean onRenderProcessGone (WebView view, RenderProcessGoneDetail detail)
void onSafeBrowsingHit (WebView view, WebResourceRequest request, int threatType, SafeBrowsingResponse callback)
void onScaleChanged (WebView view, float oldScale, float newScale)
void onTooManyRedirects (WebView view, Message cancelMsg, Message continueMsg)
void onUnhandledKeyEvent (WebView view, KeyEvent event)
WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request)
WebResourceResponse shouldInterceptRequest (WebView view, String url)
boolean shouldOverrideKeyEvent (WebView view, KeyEvent event)
boolean shouldOverrideUrlLoading (WebView view, WebResourceRequest request)
boolean shouldOverrideUrlLoading (WebView view, String url)

WebChromeClient提供以下回调方法,您的ActivityFragment可以更新WebView环境

Bitmap getDefaultVideoPoster ()
View getVideoLoadingProgressView ()
void getVisitedHistory (ValueCallback<String[]> callback)
void onCloseWindow (WebView window)
boolean onConsoleMessage (ConsoleMessage consoleMessage)
void onConsoleMessage (String message, int lineNumber, String sourceID)
boolean onCreateWindow (WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg)
void onExceededDatabaseQuota (String url, String databaseIdentifier, long quota, long estimatedDatabaseSize, long totalQuota, WebStorage.QuotaUpdater quotaUpdater)
void onGeolocationPermissionsHidePrompt ()
void onGeolocationPermissionsShowPrompt (String origin, GeolocationPermissions.Callback callback)
void onHideCustomView ()
boolean onJsAlert (WebView view, String url, String message, JsResult result)
boolean onJsBeforeUnload (WebView view, String url, String message, JsResult result)
boolean onJsConfirm (WebView view, String url, String message, JsResult result)
boolean onJsPrompt (WebView view, String url, String message, String defaultValue, JsPromptResult result)
boolean onJsTimeout ()
void onPermissionRequest (PermissionRequest request)
void onPermissionRequestCanceled (PermissionRequest request)
void onProgressChanged (WebView view, int newProgress)
void onReachedMaxAppCacheSize (long requiredStorage, long quota, WebStorage.QuotaUpdater quotaUpdater)
void onReceivedIcon (WebView view, Bitmap icon)
void onReceivedTitle (WebView view, String title)
void onReceivedTouchIconUrl (WebView view, String url, boolean precomposed)
void onRequestFocus (WebView view)
void onShowCustomView (View view, int requestedOrientation, WebChromeClient.CustomViewCallback callback)
void onShowCustomView (View view, WebChromeClient.CustomViewCallback callback)
boolean onShowFileChooser (WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams)

【讨论】:

以上是关于setWebViewClient 与 setWebChromeClient 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

AJAX 调用WebService WebApi 增删改查

无法在 Mac 上更改 mamp 端口

android webview

WebView加载页面

WebView图片点击查看

WebView