Pen*_*m10 219 android webviewclient webchromeclient
Android中的setWebViewClientvs. 之间的区别是什么setWebChromeClient?
Cri*_*ian 138
从源代码:
// 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;
}
Run Code Online (Sandbox Code Playgroud)
使用WebChromeClient可以处理Javascript对话框,favicon,标题和进度.看一下这个例子:向WebView添加alert()支持
乍一看,WebViewClient和WebChromeClient存在太多差异.但是,基本上:如果你正在开发一个不需要太多功能但是渲染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);
Run Code Online (Sandbox Code Playgroud)
并且您的WebView(理论上)将实现所有功能(作为Android本机浏览器).
may*_*ʎɐɯ 71
我觉得这个问题需要更多细节.我的回答来自Android编程,The Nerd Ranch Guide(第2版).
默认情况下,JavaScript在WebView中处于关闭状态.您并不总是需要它,但对于某些应用程序,可能需要它.
加载URL必须在配置WebView后完成,所以最后这样做.在此之前,您通过调用getSettings()获取WebSettings的实例并调用来打开JavaScript WebSettings.setJavaScriptEnabled(true).WebSettings是您可以修改WebView的三种方法中的第一种.它具有您可以设置的各种属性,例如用户代理字符串和文本大小.
之后,配置WebViewClient.WebViewClient是一个事件接口.通过提供自己的WebViewClient实现,您可以响应呈现事件.例如,您可以检测渲染器何时开始从特定URL加载图像,或者决定是否向服务器重新提交POST请求.
WebViewClient有许多方法可以覆盖,其中大部分都是你不会处理的.但是,您确实需要替换默认的WebViewClient的实现shouldOverrideUrlLoading(WebView, String).此方法确定在WebView中加载新URL时将发生的情况,例如按下链接.如果你返回true,你会说,"不要处理这个URL,我自己处理它."如果你返回false,你会说,"继续加载这个URL,WebView,我没有做任何事情用它".
默认实现使用URL触发隐式intent,就像您之前所做的那样.但现在,这将是一个严重的问题.某些Web应用程序所做的第一件事就是将您重定向到该网站的移动版本.使用默认的WebViewClient,这意味着您将立即发送到用户的默认Web浏览器.这正是您要避免的.修复很简单 - 只需覆盖默认实现并返回false.
使用WebChromeClient来完善工作 由于您花时间创建自己的WebView,让我们通过添加进度条并使用已加载页面的标题更新工具栏的副标题来进行修改.
要连接ProgressBar,您将在WebView上使用第二个回调:WebChromeClient.
WebViewClient是用于响应呈现事件的接口; WebChromeClient是一个事件接口,用于响应应该在浏览器周围更改chrome元素的事件.这包括JavaScript警报,favicon,当然还包括加载进度和当前页面标题的更新.
连接起来onCreateView(…).使用WebChromeClient来完善任务进度更新和标题更新每个都有自己的回调方法,
onProgressChanged(WebView, int)和onReceivedTitle(WebView, String).您从中获得的进度onProgressChanged(WebView, int)是0到100之间的整数.如果它是100,您知道页面已完成加载,因此您可以通过将其可见性设置为隐藏ProgressBar View.GONE.
免责声明:此信息取自Android编程:The Big Nerd Ranch Guide,获得作者许可.有关本书的更多信息或购买副本,请访问bignerdranch.com.
如果您想记录网页中的错误,您应该使用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)
}
}
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
WebChromeClient提供了以下回调方法,您Activity可以使用这些方法Fragment更新.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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
118999 次 |
| 最近记录: |