如何侦听WebView完成加载URL?

如何侦听WebView完成加载URL?

我有一个WebView从互联网上加载页面。我想展示一个ProgressBar直到装货完成。

如何侦听完成WebView?


明月笑刀无情
浏览 1061回答 3
3回答

慕村9548890

延展WebViewClient打电话onPageFinish()如下:mWebView.setWebViewClient(new WebViewClient() {    public void onPageFinished(WebView view, String url) {         // do your stuff here     }});

郎朗坤

这并不是百分之百准确。如果一个页面中有几个iframes,那么就会有多个onPageFinish(和onPageStarted)。如果您有几个重定向,它也可能失败。这种方法解决了(几乎)所有的问题:boolean loadingFinished = true;boolean redirect = false;mWebView.setWebViewClient(new WebViewClient() {     @Override     public boolean shouldOverrideUrlLoading(WebView view, String urlNewString) {         if (!loadingFinished) {             redirect = true;         }         loadingFinished = false;         webView.loadUrl(urlNewString);         return true;     }     @Override     public void onPageStarted(WebView view, String url) {         loadingFinished = false;         //SHOW LOADING IF IT ISNT ALREADY VISIBLE       }     @Override     public void onPageFinished(WebView view, String url) {         if (!redirect) {            loadingFinished = true;             //HIDE LOADING IT HAS FINISHED         } else {             redirect = false;          }     }});最新情况:根据文档:当嵌入式框架的内容发生变化时,即单击目标为iframe的链接时,将不会调用onPageStarted。我在Twitter上发现了一个特殊的例子,在Twitter上,只有一个页面被调用,逻辑有点混乱。为了解决这个问题,我在X秒之后添加了一个预定任务来删除加载。这并不是所有其他情况下都需要的。更新2:现在,使用当前的AndroidWebView实现:boolean loadingFinished = true;boolean redirect = false;     mWebView.setWebViewClient(new WebViewClient() {         @Override         public boolean shouldOverrideUrlLoading(                 WebView view, WebResourceRequest request) {             if (!loadingFinished) {                redirect = true;             }             loadingFinished = false;             webView.loadUrl(request.getUrl().toString());             return true;         }         @Override         public void onPageStarted(                 WebView view, String url, Bitmap favicon) {             super.onPageStarted(view, url, favicon);             loadingFinished = false;             //SHOW LOADING IF IT ISNT ALREADY VISIBLE           }         @Override         public void onPageFinished(WebView view, String url) {             if (!redirect) {                loadingFinished = true;                 //HIDE LOADING IT HAS FINISHED             } else {                 redirect = false;              }         }     });

梦里花落0921

我非常喜欢@NeTeInSteiN(和@Polen)解决方案,但我会用一个计数器来实现它,而不是多个布尔人或州观察者(只是另一种口味,但我认为这可能有共同之处)。它确实有一个JS的细微差别,但我觉得逻辑更容易理解。private void setupWebViewClient() {     webView.setWebViewClient(new WebViewClient() {         private int running = 0; // Could be public if you want a timer to check.         @Override         public boolean shouldOverrideUrlLoading(WebView webView, String urlNewString) {             running++;             webView.loadUrl(urlNewString);             return true;         }         @Override         public void onPageStarted(WebView view, String url, Bitmap favicon) {             running = Math.max(running, 1); // First request move it to 1.         }         @Override         public void onPageFinished(WebView view, String url) {             if(--running == 0) { // just "running--;" if you add a timer.                 // TODO: finished... if you want to fire a method.             }         }     });}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Android