У меня есть, WebView
который загружает страницу из Интернета. Я хочу показать, ProgressBar
пока загрузка не будет завершена.
Как мне прослушать завершение загрузки страницы WebView
?
У меня есть, WebView
который загружает страницу из Интернета. Я хочу показать, ProgressBar
пока загрузка не будет завершена.
Как мне прослушать завершение загрузки страницы WebView
?
Ответы:
Расширьте WebViewClient и вызовите onPageFinished () следующим образом:
источник
@ian это не на 100% точно. Если у вас есть несколько фреймов на странице, у вас будет несколько onPageFinished (и onPageStarted). И если у вас есть несколько перенаправлений, это может также потерпеть неудачу. Этот подход решает (почти) все проблемы:
ОБНОВИТЬ:
Согласно документации: onPageStarted НЕ будет вызываться при изменении содержимого встроенного фрейма, т.е. при щелчке по ссылке, целью которой является фрейм iframe.
Я обнаружил в Twitter конкретный случай, когда вызывался только pageFinished, и немного ломал логику. Чтобы решить эту проблему, я добавил запланированное задание для удаления загрузки через X секунд. Это не нужно во всех других случаях.
ОБНОВЛЕНИЕ 2 :
Теперь с текущей реализацией Android WebView:
источник
Я довольно неравнодушен к решению @NeTeInStEiN (и @polen), но реализовал бы его со счетчиком, а не с несколькими логическими значениями или наблюдателями состояния (просто другой вариант, но я подумал, что может поделиться). В этом есть нюанс JS, но я чувствую, что логику немного легче понять.
источник
running = 1;
вonPageStarted()
?Я также нашел одно изящное решение, но не проверил его строго:
источник
Я упростил код NeTeInStEiN , чтобы он был таким:
Это легко понять, OnPageFinished, если предыдущий обратный вызов включен onPageStarted, поэтому страница полностью загружена.
источник
Если вы хотите показать индикатор выполнения, вам нужно прослушивать событие изменения прогресса, а не только для завершения страницы:
Кстати, если вы хотите отображать только Indeterminate ProgressBar, переопределяющий метод onPageFinished достаточно
источник
Используйте setWebViewClient () и переопределите onPageFinished ()
источник
Вы можете отслеживать состояние прогресса с помощью метода getProgress в классе webview .
Инициализировать статус прогресса
тогда AsyncTask для загрузки так:
источник
спасибо за ответы. Это помогло мне, но мне пришлось немного улучшить его для своих нужд. У меня было несколько запусков страниц и завершений, поэтому я добавил таймер, который проверяет, запускается ли при завершении страницы новый запуск страницы. Хорошо, плохое объяснение. Смотрите код :)
источник
Вот новый метод обнаружения, когда URL-адрес загружен, используя возможности Android для ловушек JavaScript . Используя этот шаблон, мы используем знания JavaScript о состоянии документа для генерации собственного вызова метода во время выполнения Android. Эти доступные через JavaScript вызовы могут быть сделаны с помощью
@JavaScriptInterface
аннотации.Эта реализация требует , чтобы мы вызываем
setJavaScriptEnabled(true)
наWebView
параметрах «s, поэтому он не может быть приемлемым в зависимости от требований вашего приложения, например , проблемы безопасности.src / io / github / cawfree / webviewcallback / MainActivity.java (Jelly Bean, API уровень 16)
разреш / макет / activity_main.xml
По сути, мы добавляем дополнительную функцию JavaScript, которая используется для проверки состояния документа. Если он загружен, мы запускаем пользовательское
onPageLoaded()
событие в AndroidMainActivity
; в противном случае мы регистрируем прослушиватель событий, который обновляет Android, как только страница готова, используяwindow.addEventListener('onload', ...);
.Поскольку мы добавляем этот скрипт после того,
this.getWebView().loadURL("")
как был выполнен вызов , вероятно, нам вообще не нужно «прослушивать» события, поскольку у нас есть только возможность добавить хук JavaScript, сделав последовательный вызовloadURL
, когда страница уже была загружена.источник
Просто чтобы показать индикатор выполнения, достаточно методов onPageStarted и onPageFinished; но если вы хотите иметь флаг "is_loading" (наряду с перенаправлениями страниц, ...), эти методы могут выполняться с непоследовательностью, например, "onPageStarted> onPageStarted> onPageFinished> onPageFinished" очередь.
Но с моим коротким тестом (протестируйте его самостоятельно), очередь значений метода onProgressChanged равна "0-100> 0-100> 0-100> ..."
Также установите "
is_loading = false
" при закрытии активности, если это статическая переменная, потому что активность может быть завершена до окончания страницы.источник
Загрузка URL с помощью
SwipeRefreshLayout
иProgressBar
:UrlPageActivity.java:
activity_url_page.xml:
источник
Вот метод, который позволяет вам зарегистрировать,
Runnable
чтобы быть выполненным, как только определенный веб-адрес закончил загрузку. Мы связываем другRunnable
с соответствующей URLString
вMap
, и мы используемWebView
S»getOriginalUrl()
метода , чтобы выбрать соответствующий обратный вызов.источник
Рендерер не завершит рендеринг, когда вызывается метод OnPageFinshed или прогресс достигает 100%, поэтому оба метода не гарантируют, что представление было полностью отрисовано.
Но из метода OnLoadResource вы можете выяснить, что уже было отрендерено, а что еще рендерится. И этот метод вызывается несколько раз.
источник
Использовать это должно помочь .var currentUrl = "google.com" var partOfUrl = currentUrl.substring (0, currentUrl.length-2)
webView.setWebViewClient (object: WebViewClient () {
// Вы также должны переопределить другой метод переопределения для ошибки, такой как onReceiveError, чтобы увидеть, как все эти методы вызываются один за другим и как они ведут себя при отладке с точкой останова. } `
источник
для пользователей Kotlin:
Есть много методов, которые вы можете переопределить, хотя
источник