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


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

2 187

2 ответа:

С исходный код:

// 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. Но, в принципе: если вы разрабатываете веб-представление, которое не потребует слишком много функций, но рендеринга 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 (2nd edition).

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

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

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

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

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

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

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

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

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

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