В чем разница между setWebViewClient и setWebChromeClient?
В чем разница между setWebViewClient
против setWebChromeClient
в Android?
2 ответа
Из исходного кода:
// 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, значки избранного, заголовки и прогресс. Взгляните на этот пример: добавление поддержки alert() в WebView
На первый взгляд, слишком много различий между WebViewClient и WebChromeClient. Но, в основном: если вы разрабатываете WebView, который не требует слишком много функций, но рендеринга HTML, вы можете просто использовать 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).
Я чувствую, что этот вопрос нужно немного подробнее. Мой ответ основан на Android-программировании, The Nerd Ranch Guide (2-е издание).
По умолчанию JavaScript отключен в WebView. Вам не всегда нужно включать его, но для некоторых приложений это может потребоваться.
Загрузка URL должна быть сделана после настройки WebView, так что вы делаете это последним. Перед этим вы включаете JavaScript, вызывая getSettings()
чтобы получить экземпляр WebSettings и вызова WebSettings.setJavaScriptEnabled(true)
, WebSettings - это первый из трех способов изменения вашего WebView. Он имеет различные свойства, которые вы можете установить, например, строку агента пользователя и размер текста.
После этого вы настраиваете свой WebViewClient. WebViewClient - это интерфейс событий. Предоставляя собственную реализацию WebViewClient, вы можете реагировать на события рендеринга. Например, вы можете определить, когда средство визуализации начинает загружать изображение с определенного URL-адреса, или решить, следует ли повторно отправить запрос POST на сервер.
В WebViewClient есть много методов, которые вы можете переопределить, большинство из которых вам не нужны. Однако вам нужно заменить реализацию WebViewClient по умолчанию shouldOverrideUrlLoading(WebView, String)
, Этот метод определяет, что произойдет, когда новый URL-адрес будет загружен в WebView, например, нажав ссылку. Если вы возвращаете true, вы говорите: "Не обрабатывайте этот URL, я обрабатываю его сам". Если вы возвращаете false, вы говорите: "Идите вперед и загрузите этот URL, WebView, я ничего с ним не делаю" ".
Реализация по умолчанию запускает неявное намерение с URL, как вы делали ранее. Теперь, однако, это будет серьезной проблемой. В первую очередь некоторые веб-приложения перенаправляют вас на мобильную версию веб-сайта. При использовании WebViewClient по умолчанию это означает, что вы немедленно отправляетесь в веб-браузер пользователя по умолчанию. Это именно то, чего вы пытаетесь избежать. Исправить это просто - просто переопределить реализацию по умолчанию и вернуть false.
Используйте WebChromeClient, чтобы привести вещи в порядок Поскольку вы тратите время на создание своего собственного WebView, давайте немного украсим его, добавив индикатор выполнения и обновив подзаголовок панели инструментов заголовком загруженной страницы.
Чтобы подключить ProgressBar, вы будете использовать второй обратный вызов в WebView: WebChromeClient
,
WebViewClient - это интерфейс для ответа на события рендеринга; WebChromeClient - это интерфейс событий для реагирования на события, которые должны изменить элементы chrome вокруг браузера. Сюда входят предупреждения JavaScript, значки избранного и, конечно же, обновления для загрузки и заголовка текущей страницы.
Подцепи onCreateView(…)
, Использование WebChromeClient для улучшения ситуации Обновления Progress и title имеют свои собственные методы обратного вызова, onProgressChanged(WebView, int)
а также onReceivedTitle(WebView, String)
, Прогресс, который вы получаете от onProgressChanged(WebView, int)
это целое число от 0 до 100. Если это 100, вы знаете, что страница загружена, поэтому вы скрываете ProgressBar, устанавливая его видимость на View.GONE
,
Отказ от ответственности: Эта информация была взята из Android Programming: The Big Nerd Guide с разрешения авторов. Для получения дополнительной информации об этой книге или для приобретения копии, пожалуйста, посетите bignerdranch.com.
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 предоставляет следующие методы обратного вызова, с помощью которых ваш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)
Если вы хотите регистрировать ошибки с веб-страницы, вы должны использовать 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)
}
}