J'ai un WebView
qui charge une page à partir d'Internet. Je veux afficher un ProgressBar
jusqu'à ce que le chargement soit terminé.
Comment écouter la fin du chargement de la page d'un WebView
?
android
android-webview
Janusz
la source
la source
Réponses:
Étendre WebViewClient et appelez onPageFinished () comme suit:
la source
@ian ce n'est pas précis à 100%. Si vous avez plusieurs iframes dans une page, vous aurez plusieurs onPageFinished (et onPageStarted). Et si vous avez plusieurs redirections, cela peut également échouer. Cette approche résout (presque) tous les problèmes:
MISE À JOUR:
Selon la documentation: onPageStarted ne sera PAS appelé lorsque le contenu d'un cadre intégré change, c'est-à-dire en cliquant sur un lien dont la cible est un iframe.
J'ai trouvé un cas spécifique comme celui-ci sur Twitter où seule une pageFinished a été appelée et a un peu perturbé la logique. Pour résoudre ce problème, j'ai ajouté une tâche planifiée pour supprimer le chargement après X secondes. Ce n'est pas nécessaire dans tous les autres cas.
MISE À JOUR 2 :
Maintenant avec l'implémentation actuelle d'Android WebView:
la source
Je suis assez partisan de la solution @NeTeInStEiN (et @polen) mais je l'aurais implémentée avec un compteur au lieu de plusieurs booléens ou observateurs d'état (juste une autre saveur mais je pensais qu'elle pourrait partager). Il a une nuance JS à ce sujet, mais je pense que la logique est un peu plus facile à comprendre.
la source
running = 1;
dedansonPageStarted()
?J'ai également trouvé une solution élégante, mais je ne l'ai pas testée rigoureusement:
la source
J'ai simplifié le code de NeTeInStEiN pour qu'il ressemble à ceci:
Il est facile de comprendre, OnPageFinished si le rappel précédent est sur onPageStarted, de sorte que la page est complètement chargée.
la source
Si vous voulez afficher une barre de progression, vous devez écouter un événement de changement de progression, pas seulement pour l'achèvement de la page:
BTW si vous voulez afficher juste un ProgressBar indéterminé remplaçant la méthode onPageFinished est suffisant
la source
Utilisez setWebViewClient () et remplacez onPageFinished ()
la source
Vous pouvez suivre le progrès Staus par la getProgress méthode dans WebView classe.
Initialiser l'état d'avancement
puis l'AsyncTask pour le chargement comme ceci:
la source
merci pour les réponses. Cela m'a aidé, mais j'ai dû l'améliorer un peu pour mes besoins. J'ai eu plusieurs pagestarts et finitions donc j'ai ajouté une minuterie qui vérifie si après la pagefinish est démarré un nouveau pagestart. D'accord, mauvaise explication. Voir le code :)
la source
Voici une nouvelle méthode pour détecter le chargement d'une URL en utilisant la capacité d'Android pour les hooks JavaScript . En utilisant ce modèle, nous exploitons la connaissance de JavaScript de l'état du document pour générer un appel de méthode native dans le runtime Android. Ces appels accessibles en JavaScript peuvent être effectués à l'aide de l'
@JavaScriptInterface
annotation.Cette implémentation nécessite que nous appelions
setJavaScriptEnabled(true)
lesWebView
paramètres de, de sorte qu'elle pourrait ne pas convenir en fonction des exigences de votre application, par exemple des problèmes de sécurité.src / io / github / cawfree / webviewcallback / MainActivity.java (Jelly Bean, API niveau 16)
res / layout / activity_main.xml
Essentiellement, nous ajoutons une fonction JavaScript supplémentaire qui est utilisée pour tester l'état du document. S'il est chargé, nous lançons un
onPageLoaded()
événement personnalisé dans AndroidMainActivity
; sinon, nous enregistrons un écouteur d'événements qui met à jour Android une fois la page prête, en utilisantwindow.addEventListener('onload', ...);
.Étant donné que nous ajoutons ce script après l'appel à
this.getWebView().loadURL("")
, il est probable que nous n'ayons pas du tout besoin d' écouter les événements, car nous n'avons la possibilité d'ajouter le hook JavaScript qu'en effectuant un appel successif àloadURL
, une fois la page déjà chargée.la source
Juste pour montrer la barre de progression, les méthodes "onPageStarted" et "onPageFinished" suffisent; mais si vous souhaitez avoir un indicateur "is_loading" (avec des redirections de page, ...), ces méthodes peuvent être exécutées sans séquençage, comme "onPageStarted> onPageStarted> onPageFinished> onPageFinished".
Mais avec mon court test (testez-le vous-même.), La file d'attente des valeurs de la méthode "onProgressChanged" est "0-100> 0-100> 0-100> ..."
Définissez également "
is_loading = false
" à la fermeture de l'activité, s'il s'agit d'une variable statique, car l'activité peut être terminée avant la fin de la page.la source
Chargement de l'url avec
SwipeRefreshLayout
etProgressBar
:UrlPageActivity.java:
activity_url_page.xml:
la source
Voici une méthode qui vous permet d'enregistrer un fichier
Runnable
à exécuter une fois qu'une adresse Web particulière a terminé le chargement. Nous associons chacunRunnable
avec une URL correspondanteString
dans unMap
, et nous utilisons leWebView
degetOriginalUrl()
méthode pour choisir le rappel approprié.la source
Le rendu ne terminera pas le rendu lorsque la méthode OnPageFinshed est appelée ou que la progression atteint 100%, les deux méthodes ne vous garantissent donc pas que la vue a été entièrement rendue.
Mais vous pouvez déterminer à partir de la méthode OnLoadResource ce qui a déjà été rendu et ce qui est toujours en cours de rendu. Et cette méthode est appelée plusieurs fois.
la source
Utilisez cela, cela devrait aider .`var currentUrl = "google.com" var partOfUrl = currentUrl.substring (0, currentUrl.length-2)
webView.setWebViewClient (objet: WebViewClient () {
// Vous devez également remplacer une autre méthode de remplacement pour les erreurs telles que onReceiveError pour voir comment toutes ces méthodes sont appelées les unes après les autres et comment elles se comportent lors du débogage avec un point d'arrêt. } `
la source
pour les utilisateurs de Kotlin:
il y a beaucoup de méthodes que vous pouvez remplacer
la source