В чем разница между setWebViewClient и setWebChromeClient? - PullRequest
210 голосов
/ 14 мая 2010

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

Ответы [ 2 ]

136 голосов
/ 14 мая 2010

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

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

58 голосов
/ 25 декабря 2016

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

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

...