android setWebViewClient与setWebChromeClient之间的区别是什么?

6g8kf2rb  于 2023-03-06  发布在  Android
关注(0)|答案(4)|浏览(154)
    • bounty将在6天后过期**。回答此问题可获得+50声望奖励。Maya Rager希望奖励现有回答:我发现这个答案比公认的答案更有价值......我想奖励它。stackoverflow.com/questions/2835556/... and want to reward it.

setWebViewClientsetWebChromeClient在Android中有什么区别?

9jyewag0

9jyewag01#

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
乍一看,WebViewClientWebChromeClient有太多的不同之处。但是,基本上:如果你正在开发一个除了呈现HTML之外不需要太多特性的WebView,你可以只使用WebViewClient。另一方面,如果你想(例如)加载你正在呈现的页面的favicon,你应该使用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原生浏览器)。

deyfvvtc

deyfvvtc2#

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

    • 默认情况下**,WebView中的JavaScript是关闭的。您并不总是需要打开它,但对于某些应用程序,可能需要它。

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

    • 之后,配置WebViewClient。WebViewClient是一个事件接口。通过提供自己的WebViewClient实现,可以响应呈现事件。例如,可以检测呈现器何时开始从特定URL加载图像,或者决定是否向服务器重新提交POST请求。**
    • WebViewClient**有许多方法可以覆盖,但大多数方法您都不会处理。但是,您确实需要替换默认WebViewClient的shouldOverrideUrlLoading(WebView, String)实现。此方法确定在WebView中加载新URL时(如通过按链接)将发生的情况。如果返回true,则表示"不要处理此URL,我正在自己处理它"。如果返回false,你会说:"继续加载这个URL,WebView,我不会对它做任何事情。"

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

    • 使用WebChromeClient来美化内容**由于您正在花时间创建自己的WebView,让我们通过添加进度条并使用加载页面的标题更新工具栏的副标题来美化它。

要挂接ProgressBar,您将使用WebView上的第二个回调:WebChromeClient.
WebViewClient是响应渲染事件的接口;WebChromeClient是一个事件接口,用于响应浏览器周围的chrome元素发生的事件,包括JavaScript警报、图标,当然还有加载进度和当前页面标题的更新。
onCreateView(…)中连接它。使用WebChromeClient来美化它。进度更新和标题更新都有自己的回调方法,onProgressChanged(WebView, int)onReceivedTitle(WebView, String)。从onProgressChanged(WebView, int)接收的进度是一个0到100的整数。如果是100,你就知道页面已经加载完毕,所以你可以通过将ProgressBar的可见性设置为View.GONE来隐藏它。

    • 免责声明:**此信息摘自Android编程:经作者许可的《大书呆子牧场指南》。欲了解本书的更多信息或购买一本,请访问bignerdranchidercomm。
guz6ccqo

guz6ccqo3#

如果你想记录网页的错误,你应该使用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)
    }
}
vlju58qv

vlju58qv4#

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)

相关问题