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

Ответы:

148

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

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

Cristian
источник
26
В этой форме ответ не полный. ChromeClient позволяет обрабатывать перечисленные вещи, но что такое ViewClient и в чем сходства и различия?
Pentium10
3
Поможет ли этот метод улучшить некоторые плохие функции веб-просмотра по умолчанию? особенно для анимации и переходов css3?
Ata Iravani
1
Могу ли я использовать их обоих одновременно?
Сергей Дирин
1
@SergeyDirin: stackoverflow.com/a/6475858 . Направьте этот ответ, вы можете использовать оба сразу.
hoangtu23
Как обработать разрешение для камеры в webviewclient, если нет хрома?
j2emanue
100

Я чувствую, что этот вопрос требует немного больше деталей. Мой ответ основан на 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 и заголовка есть свой метод обратного вызова, onProgressChanged(WebView, int)и onReceivedTitle(WebView, String). Прогресс, от onProgressChanged(WebView, int)которого вы получаете, представляет собой целое число от 0 до 100. Если оно равно 100, вы знаете, что страница загружена, поэтому вы скрываете ProgressBar, устанавливая его видимость на View.GONE.

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

maytham-ɯɐɥʇʎɐɯ
источник
11
Я думаю, что это лучший ответ, чем принятый.
redbeam_