我有一个WebView正在从互联网加载一个页面。我想显示一个ProgressBar,直到加载完成。

我如何监听WebView页面加载的完成?


当前回答

对于Kotlin用户:

webView.webViewClient = object : WebViewClient() {
            override fun onPageFinished(view: WebView?, url: String?) {
                // do your logic
            }
        }

有很多方法你可以重写

其他回答

只是为了显示进度条,“onpagstarted”和“onPageFinished”方法就足够了;但如果你想有一个“is_loading”标志(以及页面重定向,…),这个方法可以执行非排序,如“onpagstarted > onpagstarted > onPageFinished > onPageFinished”队列。

但与我的短测试(自己测试),“onProgressChanged”方法值队列是“0-100 > 0-100 > 0-100 >…”

private boolean is_loading = false;

webView.setWebChromeClient(new MyWebChromeClient(context));

private final class MyWebChromeClient extends WebChromeClient{
    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        if (newProgress == 0){
            is_loading = true;
        } else if (newProgress == 100){
            is_loading = false;
        }
        super.onProgressChanged(view, newProgress);
    }
}

如果活动关闭是一个静态变量,也要在活动关闭时设置“is_loading = false”,因为活动可以在页面结束之前完成。

扩展WebViewClient并调用onPageFinished()如下所示:

mWebView.setWebViewClient(new WebViewClient() {

   public void onPageFinished(WebView view, String url) {
        // do your stuff here
    }
});

对于Kotlin用户:

webView.webViewClient = object : WebViewClient() {
            override fun onPageFinished(view: WebView?, url: String?) {
                // do your logic
            }
        }

有很多方法你可以重写

这将在他开始加载页面之前被调用 (并获得与onFinished()相同的参数)

@Override
public void onPageCommitVisible(WebView view, String url) {
   super.onPageCommitVisible(view, url);
}

我发现了一个优雅的解决方案,虽然没有严格测试:

public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            if (webView.getProgress() == 100) {
                progressBar.setVisibility(View.GONE);
                webView.setVisibility(View.VISIBLE);
            }
        }