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

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

    2 Solutions collect form web for “В чем разница между setWebViewClient и setWebChromeClient?”

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

     // 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, например, нажав ссылку. Если вы вернете истину, вы говорите: «Не обрабатывайте этот URL-адрес, я сам обрабатываю его». Если вы вернете false, вы говорите: «Идите и загрузите этот URL-адрес, WebView, я ничего с этим не делаю «.

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

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

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

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

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

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

    Interesting Posts

    Показать «Страница X of Y», используя одно текстовое поле

    Что такое «Аргумент-зависимый поиск» (также известный как ADL или «Koenig Lookup»)?

    VIM, показывающий «m» возле белого пространства на Cygwin

    получить NSDate сегодня, вчера, на этой неделе, в последнюю неделю, в этом месяце, в прошлом месяце … переменные

    Выполнить код только один раз после того, как приложение установлено на Android-устройстве

    Почему JVM по-прежнему не поддерживает оптимизацию хвостового вызова?

    Глобальная переменная в нескольких файлах

    Как просмотреть расширения Explorer и отключить их?

    Как использовать MDC с пулами streamов?

    смешение cout и printf для более быстрого вывода

    Проблема с удаленным отображением приложений Java

    Стирание из std :: vector при выполнении для каждого?

    Что я могу использовать для хорошего качества Code Coverage для C # /. NET?

    Откуда происходят сбои «чистой виртуальной функции»?

    Как разделить RDD на два или более RDD?

    Давайте будем гением компьютера.