В чем разница между setWebViewClient
против setWebChromeClient
в Android?
android
webviewclient
webchromeclient
Pentium10
источник
источник
Ответы:
Из исходного кода :
Использование WebChromeClient позволяет обрабатывать диалоги Javascript, значки избранного, заголовки и прогресс. Взгляните на этот пример: добавление поддержки alert () в WebView
На первый взгляд, слишком много различий между WebViewClient и WebChromeClient . Но, в основном: если вы разрабатываете WebView, который не требует слишком много функций, но отображает HTML, вы можете просто использовать
WebViewClient
. С другой стороны, если вы хотите (например) загрузить значок страницы, которую вы отображаете, вы должны использоватьWebChromeClient
объект и переопределитьonReceivedIcon(WebView view, Bitmap icon)
.В большинстве случаев, если вы не хотите беспокоиться об этих вещах ... вы можете просто сделать это:
И ваш 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 и заголовка есть свой метод обратного вызова,onProgressChanged(WebView, int)
иonReceivedTitle(WebView, String)
. Прогресс, отonProgressChanged(WebView, int)
которого вы получаете, представляет собой целое число от 0 до 100. Если оно равно 100, вы знаете, что страница загружена, поэтому вы скрываете ProgressBar, устанавливая его видимость наView.GONE
.источник