URL yüklemeyi bitiren bir WebView nasıl dinlenir?


447

Bir var WebViewinternetten bir sayfa yüklenirken söyledi. ProgressBarYükleme tamamlanana kadar a göstermek istiyorum .

A'nın sayfa yüklemesinin tamamlanmasını nasıl dinlerim WebView?


1
Lütfen cevabımı doğru olarak işaretlemeyi düşünün, çünkü ian'ın yapmadığı bazı problemleri çözer.
neteinstein

Sayfa yüklendiğinde yerel java kodu js ile aramak için daha iyi bir yol olduğunu düşünüyorum. Bu cevaba, ios için olsa da, fikir burada da geçerlidir .
Kris Roofe

Minimal ve özlü bir çözüm için aşağıdaki cevabımı kontrol edin
Skynet

Yanıtlar:


716

WebViewClient'i genişletin ve onPageFinished () yöntemini aşağıdaki gibi çağırın :

mWebView.setWebViewClient(new WebViewClient() {

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

İnternet çok hızlı olmadığında harici yüklemelerle ilgili bazı sorunlar yaşıyorum. Örneğin, Google Analytics veya bunun gibi diğer öğeler. Bazı geçici çözümleri denedim ve çok gelişti, ancak henüz mükemmel değil. Bazen uygulama yükleme ekranında donar ve ağ bağlantısını kesmezseniz veya başka bir iyi ağa bağlanmazsanız çıkmak mümkün değildir. Bunu nasıl çözeceğimi bilmiyorum, deniyorum.
Felipe

1
Mükemmel çalışıyor. Yüklemeden önce mWebView.setVisibility (View.INVISIBLE) kullanabilirsiniz. Yükleme tamamlandığında tekrar View.VISIBLE olarak ayarlayın. Bu açılış ekranı ile kullandım: android-developers.blogspot.de/2009/03/…
Johan Hoeksma

39
Bu hiç de bir çözüm değil. Bu yöntem çağrıldığında sayfanın önceden yüklendiğine dair bir garanti yoktur.
Şahin

3
Bu, Google açısından çok kötü bir tasarım. Bu eylemin tamamlandığı hemen hemen her zaman, web görünümünün kendisini değil, ana Etkinliğe yönelik bir şey yapmak istersiniz. Bir etkinliğe abone olmak yerine bir işlevi geçersiz kılmak yaygın bir anti-desen ve android geliştirmeden hoşlanmama nedenim.
Ryan

6
Bu yöntem, yükün sonlandırılmasını garanti etmez ve url yükü bir miktar ara url gezinmesi gerektiriyorsa birden fazla kez çağrılabilir. Yani bu defalarca çağrılır. Ancak kontrol etmenin bir yolu.
acemi

150

@ian bu% 100 doğru değil. Bir sayfada birkaç iframe'iniz varsa, birden çok onPageFinished (ve onPageStarted) öğeniz olur. Birkaç yönlendirmeniz varsa da başarısız olabilir. Bu yaklaşım (neredeyse) tüm sorunları çözer:

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

GÜNCELLEME:

Belgelere göre: Katıştırılmış çerçevenin içeriği değiştiğinde, yani hedefi iframe olan bir bağlantıyı tıklattığınızda onPageStarted çağrılmaz.

Twitter'da sadece bir pageFinished'ın çağrıldığı ve mantığın biraz dağınık olduğu gibi özel bir durum buldum. Bunu çözmek için X saniye sonra yüklemeyi kaldırmak için zamanlanmış bir görev ekledim. Diğer tüm durumlarda buna gerek yoktur.

GÜNCELLEME 2 :

Şimdi mevcut Android WebView uygulamasıyla:

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

3
Muhtemelen onPageStarted en doc ihtar fark etmiş: onPageStarted olacak DEĞİL gömülü çerçeve içeriğinin değişmesi, kimin hedef yani tıklayarak bir bağlantı iframe olduğunda çağrılabilir. Yani bu, bu durumlarda mantığı çarpıtabilir. BTW, @ polen'in sadeleştirmesi gerçekten işe yarıyor mu?
an00b

1
Güzel yakalamak, çerçeve şeyler fark etmedi. Ben polen kodunu denemedim .. sadece bu iş olduğunu kullanıyorum olduğunu emin olabilirsiniz.
neteinstein

3
Sadece küçük bir düzeltme. Aslında "genel geçersiz onPageStarted (WebView görünümü, String url, Bitmap favicon)" yerine "genel void onPageStarted (WebView view, String url)" yerine
MrMaffen

Yüklemeyi hiç bitirmeyen bazı yeni siteler için çalışmaz ... ör. "Agoda.com". Asla onPageFinished çağrısını alamazsınız çünkü bu bir yönlendirme.
kenyee

Bir yönlendirme sırasında iki kez çağrıldığını gördüm. Ancak, "Bir sayfada birden fazla iframe'iniz varsa, onPageFinished (ve onPageStarted) 'a sahip birden çok öğeniz varsa" onPageFinished belgelerine göre doğru değildir: "Bu yöntem yalnızca ana çerçeve için çağrılır."
garnet

40

@NeTeInStEiN (ve @polen) çözümü için oldukça kısmi değilim ama birden fazla booleans veya devlet gözlemcisi yerine bir sayaç ile uygulardı (sadece başka bir lezzet ama düşündüm). Bu konuda bir JS nüansı var ama mantığın anlaşılması biraz daha kolay olduğunu düşünüyorum.

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

2
Kod iyi görünüyor. Ben hlml veri url değil yükler benim webview için aynı çalışıyor. Ancak bu, ilk web görünümü hızlı bir şekilde yüklenirse ve ikincisi yüklenmeye başlamadan önce onPageFinished öğesini tetikler. Normal senaryo. koşu = 1, koşu = 2, --running = 1, --running = 0. Başarısız olan alışılmadık senaryo - koşuyor = 1, --running = 0, koşuyor = 1 koşuyor = 0
Ajith Memana

1
Başka bir senaryo da var, bir nedenden dolayı bir olay başlatılmadığında, TODO kısmına asla ulaşılamayacak. Yani zaman aşımlarını kontrol etmek için bir zamanlayıcıya ihtiyacınız var. Veya her şeyin düzgün şekilde yüklendiğini bildiğinizde, javascript'te dışa aktarılan bir java işlevini çağırabilirsiniz. DocumentReady () veya bunun gibi bir şey.
Codebeat

neden sadece running = 1;içinde onPageStarted()?
Choletski

@Choletski Çünkü en fazla 1 ve 1'den büyük bir sayı 1 değil
Matthew Read

25

Ben de zarif bir çözüm buldum, ancak titizlikle test etmedim:

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

2
Test ettim ve mükemmel çalışıyor, Elbette, onPageFinished yönteminin dışından çağırabilir ve kısa aralıklarla kontrol etmek için bir Handler kullanabilirsiniz - durumlarda, WebViewClient sınıfını genişletmek istemezsiniz.
Gal Rom

1
Bunun kabul edilen cevaptan daha iyi olabileceğine inanıyorum, sadece OnError'u kontrol etmeniz gerekiyor ve hazırsınız.
Evin1_

1
Bu kabul edilen cevap olmalı.
زياد

1
Bunun için oy
Khdkls

23

NeTeInStEiN kodunu şöyle olması için basitleştirdim :

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

        }
 });

Anlamak kolaydır, OnPageFinished, önceki geri arama onPageStarted'da ise, sayfa tamamen yüklenir.


3
@polen PAGE_STARTED hiçbir zaman temizlenmez mi? YaOverrideUrlLoading () hiç çağrılmazsa ne olur?
an00b

20

Bir ilerleme çubuğu göstermek istiyorsanız, yalnızca sayfanın tamamlanması için değil, bir ilerleme değişikliği etkinliği dinlemeniz gerekir:

mWebView.setWebChromeClient(new WebChromeClient(){

            @Override
            public void onProgressChanged(WebView view, int newProgress) {

                //change your progress bar
            }


        });

BTW sadece bir Belirsiz ProgressBar görüntülemek istiyorsanızPageFinished yöntemini geçersiz kılmak yeterlidir



5

İlerleme Durumunu web görünümünde getProgress yöntemiyle izleyebilirsiniz sınıfında.

İlerleme durumunu başlat

private int mProgressStatus = 0;

daha sonra böyle yüklemek için AsyncTask:

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 (); bir UI iş parçacığından çağrılması gerekir.
Skynet

5

cevaplar için teşekkürler. Bana yardımcı oldu, ama ihtiyaçlarım için biraz iyileştirmek zorunda kaldım. Birkaç pagetarts ve bitirdiğim için pagefinish'in yeni bir pagetart başlatılıp başlatılmadığını kontrol eden bir zamanlayıcı ekledim. Tamam, kötü bir açıklama. Kodu görün :)

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

});

2

İşte Android'in JavaScript kancaları özelliğini kullanarak bir URL yüklendiğinde algılanan yeni bir yöntem . Bu kalıbı kullanarak, Android çalışma zamanında yerel bir yöntem çağrısı oluşturmak için JavaScript'in belgenin durumu hakkındaki bilgisini kullanırız. Bu JavaScript'e erişilebilen çağrılar,@JavaScriptInterface ek açıklama .

Bu uygulama dediğimiz gerektirir setJavaScriptEnabled(true)üzerinde WebViewo kadar, bireyin ayarlarına uygun olmayabilir uygulamanızın gereksinimlerine, örneğin güvenlik kaygıları bağlı.

src / io / github / cawfree / webviewcallback / MainActivity.java (Jelly Bean, API Seviye 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 / düzeni / 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"
/>

Esasen, belgenin durumunu test etmek için kullanılan ek bir JavaScript işlevi ekliyoruz. Yüklüyse, onPageLoaded()Android'lerde özel bir etkinlik başlatırız MainActivity; Aksi takdirde, sayfa hazır olduğunda Android'i güncelleyen bir olay dinleyicisini kaydederiz.window.addEventListener('onload', ...); .

Çağrı yapıldıktan sonra bu komut dosyasını this.getWebView().loadURL("")eklediğimizden , etkinlikler için 'dinlememiz' gerekmiyor olabilir , çünkü JavaScript çağrısını yalnızca ardışık bir çağrı yaparak ekleme şansımız var. loadURL, sayfa zaten yüklendikten sonra.


Genellikle çalışan harika bir çözüm. Https://reddit.com/r/Nature (genellikle Reddit ile) ile ilgili sorunlar yaşıyorum , bazı iş parçacığı tıkladığınızda ve iş parçacığı yüklendiğinde, bu olayı yakalayamıyorum. Bana yardım edebilir misin?
Primož Kralj

@ PrimožKralj Bununla bazı başarılar elde ettiğinizi duyduğuma sevindim ... Özellikle ne önereceğinizden emin değilim, ancak bildiğiniz herhangi bir halka açık etkinlik varsa, örneğin yorum sayısı güncellenir, bunu kaynak olarak kullanabilirsiniz. Reddit'in API'sini doğrudan vurarak sorunun çözülebileceğini düşündünüz mü ?
Mapsy

1
Teşekkürler, tetiklenen olaylara bir göz atacağım ve bunlardan birine bağlanmaya çalışacağım. API'nın farkındayım ve gelecekte onu kullanarak daha sağlam bir çözüm uygulamaya çalışacağım. Teşekkürler!
Primož Kralj

1

Yalnızca ilerleme çubuğunu göstermek için "onPageStarted" ve "onPageFinished" yöntemleri yeterlidir; ancak "is_loading" bayrağına sahip olmak istiyorsanız (sayfa yönlendirmeleriyle birlikte ...), bu yöntemler "onPageStarted> onPageStarted> onPageFinished> onPageFinished" kuyruğu gibi sıralamanın dışında çalıştırılabilir.

Ancak kısa testimle (kendiniz test edin.), "OnProgressChanged" yöntem değerleri kuyruğu "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);
    }
}

Ayrıca is_loading = false, etkinlik "sayfa bitmeden önce tamamlanabileceğinden statik bir değişkense etkinlik kapatıldığında " "seçeneğini ayarlayın .


0

URL SwipeRefreshLayoutve ile yükleniyor 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>

0

Aşağıda Runnable, belirli bir web adresinin yüklenmesi bittikten sonra yürütülecek olan a'yı kaydetmenizi sağlayan bir yöntem verilmiştir . Her ilişkilendirmek Runnablekarşılık gelen URL ile Stringbir de Map, kullandığımız WebView'ın getOriginalUrl()uygun geri arama seçme yöntemi.

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

}

0

OnPageFinshed yöntemi çağrıldığında veya ilerleme% 100'e ulaştığında oluşturucu oluşturma işlemini tamamlamaz, bu nedenle her iki yöntem de görünümün tamamen oluşturulduğunu garanti etmez.

Ancak OnLoadResource yönteminden halihazırda neyin oluşturulduğunu ve neyin hala oluşturulduğunu anlayabilirsiniz. Ve bu yöntem birkaç kez çağrılır.

        @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.

            }
        }

0

Bunu yardımcı olması gerekir. `Var currentUrl =" google.com "var partOfUrl = currentUrl.substring (0, currentUrl.length-2)

webView.setWebViewClient (nesne: WebViewClient () {

override fun onLoadResource(WebView view, String url) {
     //call loadUrl() method  here 
     // also check if url contains partOfUrl, if not load it differently.
     if(url.contains(partOfUrl, true)) {
         //it should work if you reach inside this if scope.
     } else if(!(currentUrl.startWith("w", true))) {
         webView.loadurl("www.$currentUrl")

     } else if(!(currentUrl.startWith("h", true))) {
         webView.loadurl("https://$currentUrl")

     } else { ...}


 }

override fun onReceivedSslError(view: WebView?, handler: SslErrorHandler?, error: SslError?) {
   // you can call again loadUrl from here too if there is any error.
}

// Ayrıca, tüm bu yöntemlerin birbiri ardına nasıl çağrıldığını ve kesme noktasıyla hata ayıklama sırasında nasıl davrandıklarını görmek için onReceiveError gibi diğer geçersiz kılma yöntemlerini geçersiz kılmalısınız. } `


-1

Kotlin kullanıcıları için:

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

geçersiz kılabileceğiniz birçok yöntem var

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.