How to listen for a WebView finishing loading a URL?

前端 未结 17 993
予麋鹿
予麋鹿 2020-11-22 05:40

I have a WebView that is loading a page from the Internet. I want to show a ProgressBar until the loading is complete.

How do I listen for

17条回答
  •  借酒劲吻你
    2020-11-22 06:09

    Here's a method which allows you to register a Runnable to be executed once a particular web address has finished loading. We associate each Runnable with a corresponding URL String in a Map, and we use the WebView's getOriginalUrl() method to choose the appropriate callback.

    package io.github.cawfree.webviewcallback;
    
    /**
     *  Created by Alex Thomas (@Cawfree), 30/03/2017.
     **/
    
    import android.net.http.SslError;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.webkit.SslErrorHandler;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /** An Activity demonstrating how to introduce a callback mechanism into Android's WebView. */
    public class MainActivity extends AppCompatActivity {
    
        /* Member Variables. */
        private WebView               mWebView;
        private Map mCallbackMap;
    
        /** Create the Activity. */
        @Override protected final void onCreate(final Bundle pSavedInstanceState) {
            // Initialize the parent definition.
            super.onCreate(pSavedInstanceState);
            // Set the Content View.
            this.setContentView(R.layout.activity_main);
            // Fetch the WebView.
            this.mWebView     = (WebView)this.findViewById(R.id.webView);
            this.mCallbackMap = new HashMap<>();
            // Define the custom WebClient. (Here I'm just suppressing security errors, since older Android devices struggle with TLS.)
            this.getWebView().setWebViewClient(new WebViewClient() {
                /** Handle when a request has been launched. */
                @Override public final void onPageFinished(final WebView pWebView, final String pUrl) {
                    // Determine whether we're allowed to process the Runnable; if the page hadn't been redirected, or if we've finished redirection.
                    if(pUrl.equals(pWebView.getOriginalUrl())) {
                        // Fetch the Runnable for the OriginalUrl.
                        final Runnable lRunnable = getCallbackMap().get(pWebView.getOriginalUrl());
                        // Is it valid?
                        if(lRunnable != null) { lRunnable.run(); }
                    }
                    // Handle as usual.
                    super.onPageFinished(pWebView, pUrl);
                }
                /** Ensure we handle SSL state properly. */
                @Override public final void onReceivedSslError(final WebView pWebView, final SslErrorHandler pSslErrorHandler, final SslError pSslError) { pSslErrorHandler.proceed(); }
            });
            // Assert that we wish to visit Zonal's website.
            this.getWebView().loadUrl("http://www.zonal.co.uk/");
            // Align a Callback for Zonal; this will be serviced once the page has loaded.
            this.getCallbackMap().put("http://www.zonal.co.uk/", new Runnable() {     @Override public void run() { /* Do something. */ } });
        }
    
        /* Getters. */
        public final WebView getWebView() {
            return this.mWebView;
        }
    
        private final Map getCallbackMap() {
            return this.mCallbackMap;
        }
    
    }
    

提交回复
热议问题