Tengo un WebView
que está cargando una página de Internet. Quiero mostrar un ProgressBar
hasta que se complete la carga.
¿Cómo escucho la finalización de la carga de la página de a WebView
?
android
android-webview
Janusz
fuente
fuente
Respuestas:
Extienda WebViewClient y llame a onPageFinished () de la siguiente manera:
fuente
@ian esto no es 100% exacto. Si tiene varios iframes en una página, tendrá múltiples onPageFinished (y onPageStarted). Y si tiene varias redirecciones, también puede fallar. Este enfoque resuelve (casi) todos los problemas:
ACTUALIZAR:
De acuerdo con la documentación: no se llamará a onPageStarted cuando cambie el contenido de un marco incrustado, es decir, al hacer clic en un enlace cuyo objetivo es un iframe.
Encontré un caso específico como ese en Twitter donde solo se llamó a pageFinished y la lógica se confundió un poco. Para resolver eso, agregué una tarea programada para eliminar la carga después de X segundos. Esto no es necesario en todos los demás casos.
ACTUALIZACIÓN 2 :
Ahora con la implementación actual de Android WebView:
fuente
Soy bastante parcial con la solución @NeTeInStEiN (y @polen) pero la hubiera implementado con un contador en lugar de múltiples booleanos o observadores de estado (solo otro sabor, pero pensé que podría compartir). Tiene un matiz JS al respecto, pero creo que la lógica es un poco más fácil de entender.
fuente
running = 1;
enonPageStarted()
?También encontré una solución elegante, aunque no la he probado rigurosamente:
fuente
He simplificado el código de NeTeInStEiN para que sea así:
Es fácil de entender, OnPageFinished si la devolución de llamada anterior está en onPageStarted, por lo que la página está completamente cargada.
fuente
Si desea mostrar una barra de progreso, debe escuchar un evento de cambio de progreso, no solo para completar la página:
Por cierto, si desea mostrar solo una barra de progreso indeterminada, anular el método en PageFinished es suficiente
fuente
Use setWebViewClient () y anule onPageFinished ()
fuente
Puede rastrear el estado de progreso mediante el método getProgress en la clase webview .
Inicializar el estado del progreso.
entonces la AsyncTask para cargar así:
fuente
Gracias por las respuestas. Me ayudó, pero tuve que mejorarlo un poco para mis necesidades. Tuve varios inicios de página y acabados, así que agregué un temporizador que verifica si al finalizar el inicio de página se inicia un nuevo inicio de página. De acuerdo, mala explicación. Ver el código :)
fuente
Aquí hay un método novedoso para detectar cuando una URL se ha cargado utilizando la capacidad de Android para enlaces de JavaScript . Usando este patrón, explotamos el conocimiento de JavaScript del estado del documento para generar una llamada a un método nativo dentro del tiempo de ejecución de Android. Estas llamadas accesibles a JavaScript se pueden hacer usando la
@JavaScriptInterface
anotación.Esta implementación requiere que recurramos
setJavaScriptEnabled(true)
a laWebView
configuración de 's, por lo que podría no ser adecuada dependiendo de los requisitos de su aplicación, por ejemplo, problemas de seguridad.src / io / github / cawfree / webviewcallback / MainActivity.java (Jelly Bean, API Nivel 16)
res / layout / activity_main.xml
Esencialmente, estamos agregando una función JavaScript adicional que se utiliza para probar el estado del documento. Si está cargado, lanzamos una costumbre
onPageLoaded()
evento en AndroidMainActivity
; de lo contrario, registramos un detector de eventos que actualiza Android una vez que la página está lista, usandowindow.addEventListener('onload', ...);
.Dado que estamos agregando este script después de que
this.getWebView().loadURL("")
se haya realizado la llamada a , es probable que no necesitemos 'escuchar' los eventos en absoluto, ya que solo tenemos la oportunidad de agregar el enlace de JavaScript haciendo una llamada sucesiva aloadURL
, una vez que la página ya se ha cargado.fuente
Solo para mostrar la barra de progreso, los métodos "onPageStarted" y "onPageFinished" son suficientes; pero si desea tener un indicador "is_loading" (junto con redireccionamientos de página, ...), estos métodos pueden ejecutarse sin secuenciación, como "onPageStarted> onPageStarted> onPageFinished> onPageFinished".
Pero con mi breve prueba (pruébelo usted mismo), la cola de valores del método "onProgressChanged" es "0-100> 0-100> 0-100> ..."
También establezca "
is_loading = false
" al cerrar la actividad, si es una variable estática porque la actividad se puede finalizar antes de que finalice la página.fuente
Cargando url con
SwipeRefreshLayout
yProgressBar
:UrlPageActivity.java:
activity_url_page.xml:
fuente
Aquí hay un método que le permite registrar un archivo
Runnable
para que se ejecute una vez que una dirección web en particular haya terminado de cargarse. Asociamos cada unoRunnable
con una URL correspondienteString
en aMap
, y utilizamos el métodoWebView
'sgetOriginalUrl()
para elegir la devolución de llamada apropiada.fuente
El procesador no finalizará la representación cuando se llame al método OnPageFinshed o el progreso alcance el 100%, por lo que ambos métodos no le garantizan que la vista se haya procesado por completo.
Pero puede averiguar, a partir del método OnLoadResource, lo que ya se ha procesado y lo que todavía se está procesando. Y este método se llama varias veces.
fuente
Use esto, debería ayudar .var currentUrl = "google.com" var partOfUrl = currentUrl.substring (0, currentUrl.length-2)
webView.setWebViewClient (objeto: WebViewClient () {
// También debe anular otro método de anulación de error como onReceiveError para ver cómo se llaman todos estos métodos uno tras otro y cómo se comportan mientras se depura con punto de interrupción. } `
fuente
para usuarios de Kotlin:
aunque hay muchos métodos que puedes anular
fuente