Tengo un WebView que es la carga de una página de Internet. Quiero mostrar un ProgressBar hasta que se completa la carga.

¿Cómo puedo escuchar la finalización de la carga de la página de un WebView?

InformationsquelleAutor Janusz | 2010-06-30

15 Comentarios

  1. 682

    Extender WebViewClient y llame a onPageFinished() de la siguiente manera:

    mWebView.setWebViewClient(new WebViewClient() {
    
       public void onPageFinished(WebView view, String url) {
            //do your stuff here
        }
    });
    • Tengo algunos problemas con cargas externas cuando el Internet no es tan rápido. Por ejemplo Google Analytics u otras materias como eso. He intentado algunas soluciones y ha mejorado mucho, pero no es perfecto todavía. A veces la aplicación de la congelación de la pantalla de carga y es imposible salir, a menos que se desconecte de la red o conectar en otro bueno. No sé cómo resolver este, sin embargo, lo estoy intentando.
    • ¿por qué no usar algo como esto: stackoverflow.com/questions/4302912/android-webview-timeout
    • Funciona perfecto. Usted puede utilizar mWebView.setVisibility(Ver.INVISIBLE) antes de la carga. Cuando la carga completa de volver a Ver.VISIBLE. Yo lo he utilizado con esta pantalla de presentación: android-developers.blogspot.de/2009/03/…
    • A veces, onPageFinished será llamado incluso si la página no se vuelve totalmente, por Lo que puede obtener una pantalla en blanco en webview . Para mostrar el cuadro de diálogo de progreso hasta que la página esté completamente prestados tienes que utilizar onLoadResource y comprobar el progreso de la página. Comprobar esta respuesta stackoverflow.com/a/31537328/1066839
    • Esta no es una solución en absoluto. No hay ninguna garantía de que la página ya está cargado cuando se llama a este método.
    • Este es un mal diseño por parte de Google. Casi todo el tiempo cuando este finalice la acción que usted quiere hacer algo orientado en torno a la Actividad de los padres, no de la web de la propia vista. Reemplazar una función en lugar de suscribirse a un evento es un común anti-patrón y la razón que no me gusta de desarrollo de android.
    • donde se @Override?
    • Este método no garantiza la carga de acabado y puede ser llamado más de una vez si la dirección url de carga se lleva a algunas intermedio de la dirección url de navegación. Por lo que este se llama varias veces . Sin embargo, su manera de comprobarlo.
    • Creo que una mejor manera de llamar a los nativos de código java con js cuando la página se carga. enviar esta respuesta, aunque sea para ios, pero la idea de applys también aquí.
    • entonces, ¿qué significa exactamente esta garantía? Puede que esto garantizará al menos DOMContentLoaded (DOM ha sido completamente construido)?
    • puedo obtener la devolución de llamada después de hacer clic en enlaces dentro de webview página

  2. 145

    @ian esto no es 100% precisa. Si usted tiene varios iframes en una página que tiene varias onPageFinished (y onPageStarted). Y si usted tiene varias redirecciones también puede fallar. Este enfoque resuelve (casi) todos los problemas:

    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; 
            }
        }
    });

    ACTUALIZACIÓN:

    De acuerdo a la documentación:
    onPageStarted NO será llamado cuando el contenido de un marco insertado cambios, es decir, hacer clic en un enlace cuyo destino es un iframe.

    Me encontré con un caso específico como que en Twitter, donde sólo una pageFinished fue llamado y corrupta de la lógica un poco. Para solucionar esto he añadido una tarea programada para quitar la carga después de X segundos. Esto no es necesario en todos los demás casos.

    ACTUALIZACIÓN 2:

    Ahora con la actual de Android WebView aplicación:

    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; 
                }
            }
        });
    • Usted probablemente ha notado la advertencia en onPageStarted doc.: onPageStarted se NO se llama cuando el contenido de un marco insertado cambios, es decir, hacer clic en un enlace cuyo destino es un iframe. Así que esto puede sesgar la lógica en estos casos. Por CIERTO, ¿ @polen de la simplificación realmente funcionan?
    • Buena captura, nunca se notó el marco de cosas. No he probado el polen del código.. el único que puedo asegurar que la obra es el de arriba que estoy usando.
    • Sólo una pequeña corrección. Es en realidad «public void onPageStarted (WebView vista, Cadena de dirección url, de mapa de bits favicon)» en lugar de «public void onPageStarted(WebView vista, String url)»
    • No funciona para algunos de los nuevos sitios que nunca terminar de cargar…por ejemplo, «agoda.com». Nunca obtendrá el onPageFinished llamada porque es una redirección.
    • He visto visto onPageFinished ser llamado dos veces durante una redirección. Pero, lo que usted ha dicho, «Si usted tiene varios iframes en una página que tiene varias onPageFinished (y onPageStarted)» no a la derecha como por la documentación de onPageFinished: «se llama a Este método único para el bastidor principal.»
    • Sé que la documentación tiene todo eso, pero.. esto no sucede, al menos en todos los dispositivos de esa manera.

  3. 40

    Soy bastante parcial a @NeTeInStEiN (y @polen) de la solución, pero se han aplicado con un contador en lugar de múltiples booleanos o estado de los espectadores (sólo otro sabor, pero pensé que podría compartir). Tiene un JS matiz al respecto pero creo que la lógica es un poco más fácil de entender.

    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.
                }
            }
        });
    }
    • El código se ve bien. He estado tratando de la misma para mi webview que carga de datos html no url. Pero este uno de los desencadenantes de la onPageFinished si la primera webview se carga rápidamente y antes de la segunda comienza a cargar. Escenario Normal. ejecución =1 = 2,, a =1, a, a =0. Inusual escenario en el que se produce un error de ejecución =1, a, a = 0, ejecutando =1 =0
    • También hay otro escenario, cuando un evento no es despedido por alguna razón TODO a la parte, nunca se alcanzó. Por lo que necesita un temporizador para comprobar los tiempos de espera. O puede llamar a una exportado java función en javascript cuando usted sabe que todo está correctamente cargado. Algo así como documentReady() o algo por el estilo.
    • ¿por qué no running = 1; en onPageStarted() ?
    • Dado que el máximo de 1 y un número mayor que 1 no es 1.
  4. 23

    He simplificado NeTeInStEiN‘s de un código como este:

    mWebView.setWebViewClient(new WebViewClient() {
            private int       webViewPreviousState;
            private final int PAGE_STARTED    = 0x1;
            private final int PAGE_REDIRECTED = 0x2;
    
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String urlNewString) {
                webViewPreviousState = PAGE_REDIRECTED;
                mWebView.loadUrl(urlNewString);
                return true;
            }
    
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                webViewPreviousState = PAGE_STARTED;
                if (dialog == null || !dialog.isShowing())
                    dialog = ProgressDialog.show(WebViewActivity.this, "", getString(R.string.loadingMessege), true, true,
                            new OnCancelListener() {
    
                                @Override
                                public void onCancel(DialogInterface dialog) {
                                    //do something
                                }
                            });
            }
    
            @Override
            public void onPageFinished(WebView view, String url) {
    
                if (webViewPreviousState == PAGE_STARTED) {
                    dialog.dismiss();
                    dialog = null;
                }
    
            }
     });

    Es fácil de entender, OnPageFinished si el anterior de devolución de llamada es en onPageStarted, de modo que la página se ha cargado completamente.

    • PAGE_STARTED nunca se borra? Lo que si shouldOverrideUrlLoading() nunca se llama?
  5. 17

    Si quieres mostrar una barra de progreso que necesita escuchar para un progreso evento de cambio, no sólo para la realización de la página:

    mWebView.setWebChromeClient(new WebChromeClient(){
    
                @Override
                public void onProgressChanged(WebView view, int newProgress) {
    
                    //change your progress bar
                }
    
    
            });

    Por CIERTO, si desea mostrar sólo un Indeterminado ProgressBar reemplazar el método onPageFinished es suficiente

  6. 17

    He encontrado una solución elegante así, no lo he probado rigurosamente aunque:

    public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                if (m_webView.getProgress() == 100) {
                    progressBar.setVisibility(View.GONE);
                    m_webView.setVisibility(View.VISIBLE);
                }
            } 
    • Yo lo he probado y funciona a la perfección, Usted puede, por supuesto, la llama desde fuera de la onPageFinished método y el uso de un Controlador para comprobar en intervalos cortos – en los casos, usted no quiere extender el WebViewClient clase.
    • Creo que este podría ser mejor que aceptó contestar, usted sólo tiene que comprobar la onError y listo.
  7. 5

    Usted puede seguir el Progreso Staus por el getProgress método en webview clase.

    Inicializar el estado del progreso de la

    private int mProgressStatus = 0;

    a continuación, el AsyncTask para la carga como esta:

    private class Task_News_ArticleView extends AsyncTask<Void, Void, Void> {
        private final ProgressDialog dialog = new ProgressDialog(
                your_class.this);
    
        //can use UI thread here
        protected void onPreExecute() {
            this.dialog.setMessage("Loading...");
            this.dialog.setCancelable(false);
            this.dialog.show();
        }
    
        @Override
        protected Void doInBackground(Void... params) {
            try {
                while (mProgressStatus < 100) {
                    mProgressStatus = webview.getProgress();
    
                }
            } catch (Exception e) {
    
            }
            return null;
    
        }
    
        protected void onPostExecute(Void result) {
            if (this.dialog.isShowing()) {
                this.dialog.dismiss();
            }
        }
    }
    • mProgressStatus = webview.getProgress(); debe ser llamado desde un subproceso de interfaz de usuario.
  8. 5

    gracias por las respuestas. Me ayudó, pero tuve que mejorar un poco para mis necesidades. He tenido varios pagestarts y acabados así que he añadido un temporizador que comprueba si atfer la pagefinish se inicia una nueva pagestart. Bueno, mala explicación. Ver el código 🙂

    myWebView.setWebViewClient(new WebViewClient() {
    boolean loadingFinished = true;
    boolean redirect = false;
    long last_page_start;
    long now;
    //Load the url
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (!loadingFinished) {
    redirect = true;
    }
    loadingFinished = false;
    view.loadUrl(url);
    return false;
    }
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
    Log.i("p","pagestart");
    loadingFinished = false;
    last_page_start = System.nanoTime();
    show_splash();
    }
    //When finish loading page
    public void onPageFinished(WebView view, String url) {
    Log.i("p","pagefinish");
    if(!redirect){
    loadingFinished = true;
    }
    //call remove_splash in 500 miSec
    if(loadingFinished && !redirect){
    now = System.nanoTime();
    new android.os.Handler().postDelayed(
    new Runnable() {
    public void run() {
    remove_splash();
    }
    },
    500);
    } else{
    redirect = false;
    }
    }
    private void show_splash() {
    if(myWebView.getVisibility() == View.VISIBLE) {
    myWebView.setVisibility(View.GONE);
    myWebView_splash.setVisibility(View.VISIBLE);
    }
    }
    //if a new "page start" was fired dont remove splash screen
    private void remove_splash() {
    if (last_page_start < now) {
    myWebView.setVisibility(View.VISIBLE);
    myWebView_splash.setVisibility(View.GONE);
    }
    }
    });
  9. 1

    Aquí un nuevo método para la detecta cuando una URL que se ha cargado mediante la utilización de Android es la capacidad para JavaScript ganchos. El uso de este patrón, se explotan JavaScript del conocimiento del estado del documento a generar un método nativo en el Android runtime. Estas JavaScript accesible, se pueden realizar llamadas utilizando la @JavaScriptInterface anotación.

    Esta aplicación requiere que llamamos setJavaScriptEnabled(true) en el WebView‘s ajustes, de forma que podría no ser adecuado dependiendo de los requisitos de su aplicación, por ejemplo, los problemas de seguridad.

    src/io/github/cawfree/webviewcallback/MainActivity.java (Jelly Bean, a Nivel de API 16)

    package io.github.cawfree.webviewcallback;
    /**
    *  Created by Alex Thomas (@Cawfree), 30/03/2017.
    **/
    import android.net.http.SslError;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.webkit.JavascriptInterface;
    import android.webkit.SslErrorHandler;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    import android.widget.Toast;
    /** An Activity demonstrating how to introduce a callback mechanism into Android's WebView. */
    public class MainActivity extends AppCompatActivity {
    /* Static Declarations. */
    private static final String HOOK_JS             = "Android";
    private static final String URL_TEST            = "http://www.zonal.co.uk/";
    private static final String URL_PREPARE_WEBVIEW = "";
    /* Member Variables. */
    private WebView mWebView = null;
    /** 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);
    //Enable JavaScript.
    this.getWebView().getSettings().setJavaScriptEnabled(true);
    //Define the custom WebClient. (Here I'm just suppressing security errors, since older Android devices struggle with TLS.)
    this.getWebView().setWebViewClient(new WebViewClient() { @Override     public final void onReceivedSslError(final WebView pWebView, final SslErrorHandler pSslErrorHandler, final SslError pSslError) { pSslErrorHandler.proceed(); } });
    //Define the WebView JavaScript hook.
    this.getWebView().addJavascriptInterface(this, MainActivity.HOOK_JS);
    //Make this initial call to prepare JavaScript execution.
    this.getWebView().loadUrl(MainActivity.URL_PREPARE_WEBVIEW);
    }
    /** When the Activity is Resumed. */
    @Override protected final void onPostResume() {
    //Handle as usual.
    super.onPostResume();
    //Load the URL as usual.
    this.getWebView().loadUrl(MainActivity.URL_TEST);
    //Use JavaScript to embed a hook to Android's MainActivity. (The onExportPageLoaded() function implements the callback, whilst we add some tests for the state of the WebPage so as to infer when to export the event.)
    this.getWebView().loadUrl("javascript:" + "function onExportPageLoaded() { " + MainActivity.HOOK_JS + ".onPageLoaded(); }" + "if(document.readyState === 'complete') { onExportPageLoaded(); } else { window.addEventListener('onload', function () { onExportPageLoaded(); }, false); }");
    }
    /** Javascript-accessible callback for declaring when a page has loaded. */
    @JavascriptInterface @SuppressWarnings("unused") public final void onPageLoaded() {
    //Display the Message.
    Toast.makeText(this, "Page has loaded!", Toast.LENGTH_SHORT).show();
    }
    /* Getters. */
    public final WebView getWebView() {
    return this.mWebView;
    }
    }

    res/layout/activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <WebView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/webView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />

    Esencialmente, estamos agregando un adicional a la función de JavaScript que se utiliza para probar el estado del documento. Si se carga, en el lanzamiento de una costumbre onPageLoaded() evento en Android MainActivity; de lo contrario, se registra un detector de eventos que las actualizaciones de Android una vez que la página está preparada, utilizando window.addEventListener('onload', ...);.

    Ya estamos anexando esta secuencia de comandos después de la llamada a this.getWebView().loadURL("") se ha hecho, es probable que no necesitamos ‘escuchar’ para los eventos en absoluto, ya que solo tenemos una oportunidad para anexar el JavaScript gancho, haciendo una sucesiva convocatoria para loadURL, una vez que la página ya ha sido cargado.

    • Impresionante solución, que generalmente funciona. Estoy teniendo problemas con https://reddit.com/r/Nature (con Reddit en general), cuando usted haga clic en un hilo, y el hilo se carga, no soy capaz de atrapar a ese evento. Me puede ayudar?
    • Me alegra saber que estamos teniendo, algunos el éxito con esto… no estoy seguro de lo que sugieren en concreto, pero si hay cualquier tipo de eventos públicos que usted sabe que desencadena que se puede enlazar, por ejemplo, cuando el número de comentarios se actualiza, se puede utilizar como fuente. Han considerado que tal vez su problema podría ser solucionado por golpear a Reddit del API directamente?
    • Gracias, voy a tener otra mirada a los acontecimientos que desencadena y tratar de enganchar a uno de ellos. Soy consciente de la API, y va a tratar de implementar una solución más robusta su uso en el futuro. Gracias!
  10. 0

    Carga url con SwipeRefreshLayout y ProgressBar:

    UrlPageActivity.java:

        WebView webView;
    SwipeRefreshLayout _swipe_procesbar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_url_page);
    String url = "http://stackoverflow.com/";
    _swipe_procesbar = (SwipeRefreshLayout)findViewById(R.id.url_path_swipe_procesbar);
    _swipe_procesbar.post(new Runnable() {
    @Override
    public void run() {
    _swipe_procesbar.setRefreshing(true);
    }
    }
    );
    webView = (WebView) findViewById(R.id.url_page_web_view);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.setWebViewClient(new WebViewClient() {
    public void onPageFinished(WebView view, String url) {
    _swipe_procesbar.setRefreshing(false);
    _swipe_procesbar.setEnabled(false);
    }
    });
    webView.loadUrl(url);
    }

    activity_url_page.xml:

    <android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/url_path_swipe_procesbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.test.test1.UrlPageActivity">
    <WebView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/url_page_web_view" />
    </RelativeLayout>
    </android.support.v4.widget.SwipeRefreshLayout>
  11. 0

    He aquí un método que le permite registrar un Runnable a ser ejecutado una vez que una determinada dirección web se ha terminado de cargar. Asociamos a cada Runnable con una dirección URL correspondiente String en un Map, y usamos la WebView‘s getOriginalUrl() método para elegir la más adecuada de devolución de llamada.

    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<String, Runnable> 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<String, Runnable> getCallbackMap() {
    return this.mCallbackMap;
    }
    }
  12. 0

    Sólo para mostrar la barra de progreso, «onPageStarted» y «onPageFinished» métodos son suficientes; pero si usted quiere tener un «is_loading» bandera (junto con la página redirige a, …), este método puede ejecutar con no-secuenciación, como «onPageStarted > onPageStarted > onPageFinished > onPageFinished» de la cola.

    Pero con mi short test (prueba de ti mismo)., «onProgressChanged» método de los valores de la cola es de «0 a 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);
    }
    }

    También establecer «is_loading = false» en la actividad de cierre, si se trata de una variable estática debido a que la actividad puede ser terminado antes de la página de finalizar.

  13. 0

    de Kotlin usuarios:

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

    hay un montón de métodos que puede reemplazar a pesar de

  14. 0

    El procesador no va a terminar de representación cuando el OnPageFinshed se llama al método o el progreso llegue al 100%, por lo que ambos métodos no garantizan que la vista estaba completamente rendida.

    Pero usted puede averiguar de OnLoadResource método de lo que ya ha sido representado y lo que es todavía de representación. Y este método se llama varias veces.

            @Override
    public void onLoadResource(WebView view, String url) {
    super.onLoadResource(view, url);
    //Log and see all the urls and know exactly what is being rendered and visible. If you wanna know when the entire page is completely rendered, find the last url from log and check it with if clause and implement your logic there.
    if (url.contains("assets/loginpage/img/ui/forms/")) {
    //loginpage is rendered and visible now.
    //your logic here.
    }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here