Какая разница между setWebViewClient и setWebChromeClient?

В чем разница между setWebViewClient и setWebChromeClient в Android?

Ответ 1

Из исходного кода:

// 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).

Ответ 2

Я чувствую, что этот вопрос нуждается немного подробнее. Мой ответ вдохновлен Android-программированием, The Nerd Ranch Guide (2-е издание).

По умолчанию, JavaScript отключен в WebView. Вам не всегда нужно иметь его, но для некоторых приложений может потребоваться его.

Загрузка URL-адреса должна быть выполнена после настройки WebView, поэтому вы делаете это последним. До этого вы включаете JavaScript, вызывая getSettings(), чтобы получить экземпляр WebSettings и вызов WebSettings.setJavaScriptEnabled(true). WebSettings - это первый из трех способов, которыми вы можете изменить свой WebView. Он имеет различные свойства, которые вы можете установить, например, строку пользовательского агента и размер текста.

После этого вы настраиваете свой WebViewClient. WebViewClient - это интерфейс событий. Предоставляя собственную реализацию WebViewClient, вы можете реагировать на события рендеринга. Например, вы можете обнаружить, когда рендер начинает загружать изображение с определенного URL-адреса или решает, повторно отправить запрос POST на сервер.

WebViewClient имеет множество методов, которые вы можете переопределить, большинство из которых вы не будете иметь дело. Однако вам нужно заменить реализацию WebViewClients по умолчанию shouldOverrideUrlLoading(WebView, String). Этот метод определяет, что произойдет, когда новый URL-адрес будет загружен в WebView, например, нажав ссылку. Если вы вернете истину, вы говорите: "Не обрабатывайте этот URL-адрес, я сам обрабатываю его". Если вы вернете false, вы говорите: "Идите и загрузите этот URL-адрес, WebView, я ничего не сделаю с ним".

Реализация по умолчанию запускает неявное намерение с URL-адресом, как и раньше. Но теперь это будет серьезная проблема. Первое, что делают некоторые веб-приложения, - это перенаправить вас на мобильную версию веб-сайта. С помощью WebViewClient по умолчанию это означает, что вы сразу же отправлены в веб-браузер пользователя по умолчанию. Это именно то, чего вы пытаетесь избежать. Исправление простое - просто переопределите реализацию по умолчанию и верните false.

Использовать WebChromeClient для создания вещей вверх Так как вы тратите время на создание своего собственного WebView, немного сократите его, добавив индикатор выполнения и обновив подзаголовок панели инструментов с заголовком загруженной страницы.

Чтобы подключить ProgressBar, вы будете использовать второй обратный вызов в WebView: WebChromeClient.

WebViewClient - это интерфейс для ответа на события рендеринга; WebChromeClient - это интерфейс событий для реагирования на события, которые должны изменять элементы хром вокруг браузера. Это включает в себя предупреждения JavaScript, значки и, конечно, обновления для загрузки прогресса и название текущей страницы.

Подключите его в onCreateView(…). Использование WebChromeClient для экспорта Обновления обновлений и обновления заголовков имеют свой собственный метод обратного вызова, onProgressChanged(WebView, int) и onReceivedTitle(WebView, String). Прогресс, который вы получаете от onProgressChanged(WebView, int), представляет собой целое число от 0 до 100. Если это 100, вы знаете чтобы страница была загружена, поэтому вы скроете ProgressBar, установив ее видимость на View.GONE.

Отказ от ответственности:. Эта информация была взята из Android Programming: The Big Nerd Ranch Guide с разрешения авторов. Для большего информацию об этой книге или приобрести копию, пожалуйста, посетите bignerdranch.com.