Eu tenho um WebView
que está carregando uma página da Internet. Quero mostrar um ProgressBar
até que o carregamento esteja completo.
Como escuto a conclusão do carregamento da página de um WebView
?
android
android-webview
Janusz
fonte
fonte
Respostas:
Estenda o WebViewClient e chame onPageFinished () da seguinte maneira:
fonte
@ian isso não é 100% exato. Se você tiver vários iframes em uma página, terá vários onPageFinished (e onPageStarted). E se você tiver vários redirecionamentos, também poderá falhar. Essa abordagem resolve (quase) todos os problemas:
ATUALIZAR:
De acordo com a documentação: onPageStarted NÃO será chamado quando o conteúdo de um quadro incorporado for alterado, ou seja, clicar em um link cujo destino seja um iframe.
Encontrei um caso específico como esse no Twitter em que apenas uma página Finalizada foi chamada e mexeu um pouco na lógica. Para resolver isso, adicionei uma tarefa agendada para remover o carregamento após X segundos. Isso não é necessário em todos os outros casos.
ATUALIZAÇÃO 2 :
Agora, com a implementação atual do Android WebView:
fonte
Sou bastante parcial com a solução @NeTeInStEiN (e @polen), mas a teria implementado com um contador em vez de vários booleanos ou observadores de estado (apenas outro sabor, mas achei que poderia compartilhar). Ele tem uma nuance de JS, mas acho que a lógica é um pouco mais fácil de entender.
fonte
running = 1;
entraronPageStarted()
?Também encontrei uma solução elegante, mas não a testei rigorosamente:
fonte
Eu simplifiquei o código do NeTeInStEiN para ficar assim:
É fácil entender, OnPageFinished se o retorno de chamada anterior estiver em onPageStarted, para que a página seja completamente carregada.
fonte
Se você deseja mostrar uma barra de progresso, precisa ouvir um evento de mudança de progresso, não apenas para a conclusão da página:
BTW, se você deseja exibir apenas uma ProgressBar Indeterminada, substituindo o método onPageFinished, é suficiente
fonte
Use setWebViewClient () e substitua onPageFinished ()
fonte
Você pode rastrear o Progress Staus pelo método getProgress em webview classe .
Inicialize o status do progresso
então o AsyncTask para carregar assim:
fonte
obrigado pelas respostas. Isso me ajudou, mas tive que melhorar um pouco para as minhas necessidades. Como eu tinha várias pagestarts e acabamentos, adicionei um timer que verifica se após o início da página é iniciado um novo pagestart. Ok, explicação ruim. Veja o código :)
fonte
Aqui está um novo método para detectar quando um URL é carregado utilizando a capacidade do Android para ganchos de JavaScript . Usando esse padrão, exploramos o conhecimento do JavaScript sobre o estado do documento para gerar uma chamada de método nativa no tempo de execução do Android. Essas chamadas acessíveis por JavaScript podem ser feitas usando a
@JavaScriptInterface
anotação.Essa implementação requer que solicitemos
setJavaScriptEnabled(true)
asWebView
configurações do sistema, portanto, pode não ser adequado, dependendo dos requisitos do seu aplicativo, por exemplo, preocupações de segurança.src / io / github / cawfree / webviewcallback / MainActivity.java (Jelly Bean, API nível 16)
res / layout / activity_main.xml
Basicamente, anexamos uma função JavaScript adicional usada para testar o estado do documento. Se estiver carregado, lançamos um
onPageLoaded()
evento personalizado no AndroidMainActivity
; caso contrário, registramos um ouvinte de evento que atualiza o Android quando a página estiver pronta, usandowindow.addEventListener('onload', ...);
.Como anexamos esse script depois que a chamada
this.getWebView().loadURL("")
foi feita, é provável que não precisemos 'ouvir' os eventos, pois só temos a chance de anexar o gancho JavaScript, fazendo uma chamada sucessiva paraloadURL
, uma vez que a página já foi carregada.fonte
Apenas para mostrar a barra de progresso, os métodos "onPageStarted" e "onPageFinished" são suficientes; mas se você deseja ter um sinalizador "is_loading" (junto com os redirecionamentos de página, ...), esses métodos podem ser executados sem sequenciamento, como a fila "onPageStarted> onPageStarted> onPageFinished> onPageFinished".
Mas com o meu teste curto (teste você mesmo.), A fila de valores do método "onProgressChanged" é "0-100> 0-100> 0-100> ..."
Defina também "
is_loading = false
" no fechamento da atividade, se for uma variável estática, porque a atividade pode ser concluída antes do término da página.fonte
Carregando URL com
SwipeRefreshLayout
eProgressBar
:UrlPageActivity.java:
activity_url_page.xml:
fonte
Aqui está um método que permite que você registre um
Runnable
a ser executado assim que um determinado endereço da Web terminar de carregar. Associamos cadaRunnable
um a uma URL correspondenteString
em aMap
e usamos o métodoWebView
'sgetOriginalUrl()
para escolher o retorno de chamada apropriado.fonte
O renderizador não concluirá a renderização quando o método OnPageFinshed for chamado ou o progresso atingir 100%, para que ambos os métodos não garantam que a exibição tenha sido renderizada completamente.
Mas você pode descobrir pelo método OnLoadResource o que já foi renderizado e o que ainda está sendo renderizado. E esse método é chamado várias vezes.
fonte
Use isso para ajudar. Var currentUrl = "google.com" var partOfUrl = currentUrl.substring (0, currentUrl.length-2)
webView.setWebViewClient (objeto: WebViewClient () {
// Você também deve substituir outro método de substituição como erro, como onReceiveError, para ver como todos esses métodos são chamados um após o outro e como eles se comportam durante a depuração com ponto de interrupção. } `
fonte
para usuários do Kotlin:
existem muitos métodos que você pode substituir
fonte