Яка різниця між 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, фавікони, заголовки та прогрес. Погляньте на цей приклад: Додавання підтримки () попередження () до веб-перегляду

На перший погляд, занадто багато відмінностей 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).


26
У цій формі відповідь не є повною. ChromeClient дозволяє обробляти перелічені речі, але що таке ViewClient та які подібності та відмінності?
Pentium10

3
Чи допоможе цей метод покращити деякі погані функції веб-перегляду за замовчуванням? особливо для анімації та переходів css3?
Ата Іравані

1
Чи можу я використовувати обоє одночасно?
Сергій Дірін

1
@SergeyDirin: stackoverflow.com/a/6475858 . Зверніться до цієї відповіді, ви можете використовувати обидва одночасно.
hoangtu23

Як поводитися з дозволом на камеру в веб-переглядачі, якщо немає хрому?
j2emanue

100

Я вважаю, що це питання потребує трохи більше деталей. Моя відповідь натхненна програмою Android програмування, керівництвом Nerd Ranch (2-е видання).

За замовчуванням JavaScript у веб-перегляді вимкнено. Не завжди потрібно його вмикати, але для деяких додатків це може знадобитися.

Завантаження URL-адреси потрібно здійснити після налаштування веб-перегляду, тому ви зробите це останньою. Перед цим увімкніть JavaScript, зателефонувавши, getSettings()щоб отримати екземпляр WebSettings та зателефонувавшиWebSettings.setJavaScriptEnabled(true) . WebSettings - це перший із трьох способів змінити ваш WebView. Він має різні властивості, які ви можете встановити, наприклад, рядок і розмір тексту агента користувача.

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

WebViewClient має багато методів, якими ви можете перекрити, більшість з яких ви не будете мати справу. Однак вам потрібно замінити реалізацію за замовчуванням WebViewClientshouldOverrideUrlLoading(WebView, String) . Цей метод визначає, що станеться, коли у веб-перегляд буде завантажена нова URL-адреса, наприклад, натиснувши посилання. Якщо ви повернете правду, ви говорите: "Не обробляйте цю URL-адресу, я сама обробляю її". Якщо ви повернете помилкове значення, ви говорите: "Вперед та завантажуйте цю URL-адресу, WebView, я з цим нічого не роблю".

Реалізація за замовчуванням запускає неявний намір з URL, як і раніше. Однак, це була б серйозна проблема. Перше, що деякі веб-програми роблять, це перенаправити вас на мобільну версію веб-сайту. З веб-переглядачем за замовчуванням WebViewClient означає, що вас негайно відправляють у веб-браузер за замовчуванням користувача. Це саме те, чого ви намагаєтеся уникати. Виправлення просте - просто скасуйте реалізацію за замовчуванням і поверніть хибну.

Використовуйте WebChromeClient для оброблення речей. Оскільки ви витрачаєте час на створення власного веб-перегляду, давайте трохи проробити його, додавши панель прогресу та оновивши підзаголовки панелі інструментів заголовком завантаженої сторінки.

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

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

Зачепи його onCreateView(…). Використання WebChromeClient для виправдання речей оновлень Progress та оновлень заголовків має свій власний метод зворотного виклику onProgressChanged(WebView, int)та onReceivedTitle(WebView, String). Прогрес, який ви отримуєте, onProgressChanged(WebView, int)- це ціле число від 0 до 100. Якщо це 100, ви знаєте, що сторінка виконується завантаженням, тому ви ховаєте програму ProgressBar, встановлюючи її видимість на View.GONE.

Відмова від відповідальності: Ця інформація була взята з програмування Android: Посібник з ранчо великих рангів з дозволу авторів. Для отримання додаткової інформації про цю книгу або для придбання примірника, відвідайте сторінку bignerdranch.com.


11
Я думаю, що це краща відповідь, ніж прийнята.
redbeam_
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.