WebView – это компонент, с помощью которого можно отображать веб-страницы. Однако нас интересует не только показ содержимого страницы, нам нужно также взаимодействовать с этим содержимым. В этой статье мы попытаемся объяснить некоторые детали этого процесса.
Важно! Прежде всего, если вы хотите загрузить веб-страницу из Интернета, не забудьте добавить следующее разрешение в файл AndroidManifest.xml.
Есть несколько способов задать содержимое для WebView.
Класс WebSettings
Этот класс позволяет управлять настройками состояния WebView. Когда WebView создаётся, он получает набор настроек по умолчанию. Эти настройки по умолчанию можно получить с помощью вызова геттера. Объект WebSettings, полученный из webView.getSettings(), привязан к времени существования этого объекта WebView. Если WebView был уничтожен, любой вызов метода WebSettings вызовет исключение IllegalStateException.
Чтобы использовать JavaScript, нужно включить его, вызвав у объекта WebSettings метод setJavaScriptEnabled().
Класс WebViewClient
WebViewClient вызывается, когда выполняется рендеринг содержимого страницы. Вы также можете перехватит здесь загрузку URL (с помощью метода shouldOverrideUrlLoading()).
WebViewClient позволяет прослушивать события веб-страницы, например, когда она начинает загружаться, или завершила загрузку, когда произошла ошибка, связанная с загрузкой страницы, отправкой формы, ссылками, и другими событиями.
Реализация экземпляра WebViewClient может быть, например, следующей.
Затем задать WebViewClient для WebView можно с помощью метода setWebViewClient().
Класс WebChromeClient
Этот класс позволяет прослушивать вызовы JavaScript, уведомления текущей страницы, такие как сообщения консоли, предупреждения, прогресс обновления страницы и другие вызовы JavaScript.
С помощью WebChromeClient мы можем обрабатывать события JS.
Затем задать экземпляр WebChromeClient можно следующим способом.
Привязка JavaScript к Android
WebView позволяет привязать код JavaScript к коду Android через интерфейс.
Для этого мы должны использовать метод addJavaScriptInterface(), в который передаются класс, предоставляющий интерфейс для JS, и имя, которое будет использоваться для отображения экземпляра в JS (например, “AndroidFunction“). В результате будет создан интерфейс с именем AndroidFuction для JavaScript, работающего в WebView.
С помощью этого способа мы можем:
- Выполнить метод, описанный в Java, из JS.
- Выполнить из Java метод, описанный в JS.
JavaScript вызывает Java
Например, опишем класс с нашими методами, которые мы хотим выполнить в JS.
Примечание: аннотация @JavascriptInterface обязательна для API 17 и выше.
Затем установим этот интерфейс в WebView.
Для взаимодействия с java-кодом в JS мы должны использовать имя интерфейса.
Java вызывает JavaScript
Допустим, у нас есть такой код на HTML.
Тогда в Java-коде нам нужно добавить вызов метода loadUrl(), в параметры которого нужно передать имя объявленного в JS метода.
После этого, загрузив страницу, мы можем выполнять код JavaScript прямо из Java.
Спасибо большое! Гениальная статья
Так а все таки если из Java надо запустить JS функцию это надо постоянно перезапускать вебвью через loadurl по сути?
«После этого, загрузив страницу, мы можем выполнять код JavaScript прямо из Java.»
так вот это вот как???
а понял. вызов не очищает вебвью. только медленно оно ((
Все получилось, спасибо! Долго не мог найти ответа
Вместо
webView.loadUrl(“javascript:increment()”);
правильнее использовать
webView.evaluateJavascript(“javascript:increment()”, nil);
Второй параметр – результат выполнения скрипта. В данном случае он не нужен.
Здравствуйте.
У меня есть страница file:///android_asset/offline.html. Это offline на ней есть кнопка обновить проверить интернет соединение. По нажатию на нeё выполняется функция в JS и вызывает JAVA далее идет обновление обратно на сайт https://test.php. Как это сделать у меня не работает.
@JavascriptInterface
public void showToast(String toast) {
//ТУТ ПРОВЕРКА ИНТЕРНЕТА
…
asw_view.loadUrl(“https://test.ru”); ВОЗВРАЩАЕМСЯ ОБРАТНО не работает
}
Нуждаюсь в совете?