Comment écouter pour une WebView fin du chargement d'une URL?
J'ai un WebView
lors du chargement d'une page à partir de l'Internet. Je veux montrer une ProgressBar
jusqu'à ce que le chargement est terminé.
Comment puis-je écouter de la fin de la page de chargement d'un WebView
?
- Veuillez envisager de marquer ma réponse comme correcte, car elle résout certains problèmes que ian n'a pas.
- Je pense qu'un meilleur moyen pour appeler le code java natif avec js lorsque la page est chargée. Consulter cette réponse, si c'est pour ios, mais l'idée applys ici aussi.
- Vérifier ma réponse ci-dessous pour les minimes et concis solution
Vous devez vous connecter pour publier un commentaire.
Étendre WebViewClient et appel onPageFinished() comme suit:
@Override
?DOMContentLoaded
(DOM a été entièrement construit)?@ian ce n'est pas précis à 100%. Si vous avez plusieurs iframe dans une page, vous aurez de multiples onPageFinished (et onPageStarted). Et si vous avez plusieurs redirige il 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 incorporé les modifications, c'est à dire en cliquant sur un lien dont la cible est un iframe.
J'ai trouvé un cas spécifique comme ça sur Twitter, où seule une pageFinished a été appelé et a sali la logique un peu. Pour le résoudre 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 Android WebView mise en œuvre:
Je suis assez partielle de @NeTeInStEiN (et @polen) solution, mais qui aurait mis en oeuvre avec un compteur au lieu de plusieurs des booléens ou des observateurs d'état (juste une autre saveur, mais je pensais peut-être partager). Il a un JS nuance à ce sujet mais je sens que la logique est un peu plus facile à comprendre.
running = 1;
dansonPageStarted()
?J'ai simplifié NeTeInStEiNle code comme cela:
Il est facile à comprendre, OnPageFinished si le rappel est sur onPageStarted, de sorte que la page soit complètement chargée.
Si vous souhaitez afficher une barre de progression vous avez besoin d'écouter pour un événement de changement, pas seulement pour l'achèvement de la page:
BTW, si vous souhaitez afficher uniquement d'une durée Indéterminée ProgressBar substitution de la méthode onPageFinished est assez
J'en ai trouvé une solution élégante ainsi, ne l'ai pas testé rigoureusement bien:
Utilisation setWebViewClient() et remplacer onPageFinished()
Vous pouvez suivre les Progrès Staus par le getProgress méthode dans webview classe.
Initialiser l'état d'avancement
puis l'AsyncTask pour le chargement comme ceci:
merci pour les réponses. Il m'a aidé, mais j'ai eu l'améliorer un peu pour mes besoins. J'ai eu plusieurs pagestarts et de finitions j'ai donc ajouté une minuterie qui vérifie si atfer la pagefinish est lancé un nouveau pagestart. Bon, mauvaise explication. Voir le code 🙂
Voici une nouvelle méthode pour détectée lorsqu'une URL est chargé par l'utilisation de Android capacité du JavaScript crochets. L'utilisation de ce modèle, nous exploitons JavaScript connaissance de l'état du document à générer un natif de l'appel de méthode à l'intérieur de l'Android runtime. Ces JavaScript accessible les appels peuvent être effectués à l'aide de la
@JavaScriptInterface
annotation.Cette mise en œuvre exige que nous appelons
setJavaScriptEnabled(true)
sur leWebView
's paramètres, de sorte qu'il pourrait ne pas être approprié selon les exigences de votre application, par exemple, les préoccupations de sécurité.src/io/github/cawfree/webviewcallback/MainActivity.java (Jelly Bean, l'API de Niveau 16)
res/layout/activity_main.xml
Essentiellement, nous sommes en ajoutant un supplément de fonction JavaScript qui est utilisé pour tester l'état du document. Si elle est chargée, nous avons lancé une coutume
onPageLoaded()
événement dans AndroidMainActivity
; sinon, nous enregistrer un écouteur d'événement que les mises à jour Android une fois que la page est prête, à l'aide dewindow.addEventListener('onload', ...);
.Puisque nous sommes ajoutant ce script après l'appel à
this.getWebView().loadURL("")
a été faite, il est probable que nous n'avons pas besoin de ' "écouter" pour les événements de tous, puisque nous obtenez seulement une chance d'ajouter le JavaScript crochet en faisant un appel successif àloadURL
, une fois que la page a déjà été chargé.Le chargement de l'url avec
SwipeRefreshLayout
etProgressBar
:UrlPageActivity.java:
activity_url_page.xml:
Voici une méthode qui vous permet de vous inscrire à un
Runnable
à être exécutée une fois un site web particulier de l'adresse de chargement est terminé. Nous associons à chaqueRunnable
avec une URL correspondant àString
dans unMap
, et nous utilisons laWebView
'sgetOriginalUrl()
méthode pour choisir le rappel.Juste pour montrer la barre de progression, "onPageStarted" et "onPageFinished" méthodes sont assez; mais si vous voulez avoir un "is_loading" drapeau (ainsi que la page de redirection, ...), ces méthodes peuvent exécuté avec les non-séquençage, comme "onPageStarted > onPageStarted > onPageFinished > onPageFinished" file d'attente.
Mais avec mon petit test (test vous-même.), "onProgressChanged" méthode des valeurs de la file d'attente est "0-100 > 0-100 > 0-100 > ..."
Également définir "
is_loading = false
" sur l'activité de proximité, si c'est une variable statique car l'activité peut être fini avant la finition de page.pour Kotlin utilisateurs:
il ya beaucoup de méthodes que vous pouvez remplacer si
Le moteur de rendu ne sera pas terminer le rendu lors de la OnPageFinshed méthode est appelée ou la progression atteint 100% donc, les deux méthodes ne vous garantit pas que la vue était complètement rendu.
Mais vous pouvez déterminer à partir de OnLoadResource méthode de ce qui a déjà été rendue et ce qui est encore le rendu. Et cette méthode est appelée plusieurs fois.