Як слухати, як WebView закінчує завантаження URL-адреси?


447

У мене WebViewє завантаження сторінки з Інтернету. Я хочу показати a, ProgressBarпоки завантаження не завершиться.

Як прослухати завершення завантаження сторінки WebView?


1
Будь ласка, вважайте, як позначити мою відповідь правильною, оскільки вона вирішує деякі проблеми, які не має Ян.
neteinstein

Я думаю, що кращий спосіб зателефонувати до рідного коду Java з js під час завантаження сторінки. Зверніться до цієї відповіді, хоча це стосується ios, але ідея стосується і тут .
Kris Roofe

Перевірте мою відповідь нижче щодо мінімального та стислого рішення
Skynet

Відповіді:


716

Продовжити WebViewClient і виклик onPageFinished () наступним чином :

mWebView.setWebViewClient(new WebViewClient() {

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

У мене є проблеми із зовнішніми завантаженнями, коли Інтернет не такий швидкий. Наприклад, Google Analytics або інші подібні матеріали. Я спробував кілька обхідних шляхів, і він значно покращився, але ще не ідеальний. Іноді додаток зависає на екрані завантаження, і вийти з нього неможливо, якщо ви не відключите мережу або не підключитесь до іншого хорошого. Я ще не знаю, як це вирішити, я намагаюся.
Феліпе

1
Працює ідеально. Ви можете використовувати mWebView.setVisibility (View.INVISIBLE) перед завантаженням. Коли завантаження завершено, встановіть його назад на View.VISIBLE. Я використав це з цим екраном заставки: android-developers.blogspot.de/2009/03/…
Йоган Хоексма

39
Це зовсім не рішення. Немає гарантії, що сторінка вже завантажена під час виклику цього методу.
Хоук

3
Це така погана конструкція з боку Google. Майже весь час, коли ця дія завершується, ви хочете робити щось орієнтоване навколо батьківської активності, а не самого веб-перегляду. Перезавантаження функції замість передплати на подію є загальною антидіаграмою, і я не люблю розробку Android.
Райан

6
Цей метод не гарантує закінчення завантаження і його можна викликати не один раз, якщо навантаження URL-адреса займає деяку проміжну навігацію по URL-адресі. Тож це називається кілька разів. Однак це спосіб це перевірити.
початківець

150

@ian це не на 100% точно. Якщо у вас є кілька iframes на сторінці, у вас буде кілька onPageFinished (і 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; 
        }
    }
});

ОНОВЛЕННЯ:

Відповідно до документації: onPageStarted НЕ буде викликатися, коли зміст вбудованого кадру змінюється, тобто натискання посилання, ціль якого є рамкою.

Я знайшов такий конкретний випадок, як у Твіттері, де зателефонувала лише сторінкаЗакінчена і трохи змішала логіку. Щоб вирішити, я додав планове завдання зняти завантаження через X секунд. Це не потрібно в усіх інших випадках.

ОНОВЛЕННЯ 2 :

Тепер із поточною реалізацією Android WebView:

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
Ви, напевно, помітили застереження в документі onPageStarted: onPageStarted НЕ буде викликатися, коли зміст вбудованого кадру змінюється, тобто натискання посилання, ціль якого є рамкою. Тож це може перекрутити логіку в тих випадках. BTW, чи спрощення @ polen дійсно працює?
an00b

1
Хороший улов, ніколи не помічав кадру. Я не пробував код поляни. Єдине, що я можу запевнити, що робота - це вище, що я використовую.
neteinstein

3
Просто незначна корекція. Насправді це "публічна недійсність на PoageStarted (перегляд WebView, String url, Bitmap favicon)", а не "публічна недійсна onPageStarted (перегляд WebView, String URL)"
MrMaffen

Не працює для деяких нових сайтів, які ніколи не закінчують завантаження ... наприклад, "Agoda.com". Ви ніколи не отримуєте дзвінок onPageFinished, оскільки це перенаправлення.
kenyee

Я бачив, як onPageFinished дзвонили двічі під час переадресації. Але те, що ви сказали "Якщо у вас є декілька iframes на сторінці, у вас буде кілька onPageFinished (і onPageStarted)", невірно, як зазначено в документації на onPageFinished: "Цей метод викликається лише для основного кадру."
гранат

40

Я досить частковий до рішення @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.
            }
        }
    });
}

2
Код виглядає добре. Я намагався те ж саме для свого веб-перегляду, який завантажує з html-даних не URL. Але це запускає onPageFinished, якщо перший веб-перегляд завантажується швидко, а другий починає завантажуватися. Нормальний сценарій. біг = 1, біг = 2, - запуску = 1, - запущення = 0. Незвичний сценарій, який виходить з ладу - біг = 1, - запуску = 0, біг = 1 біг = 0
Айфіт Мемана

1
Існує також інший сценарій, коли подія з певних причин не припиняється, частина TODO ніколи не буде досягнута. Тож вам потрібен таймер, щоб перевірити наявність таймаутів. Або ви можете викликати експортовану функцію java в javascript, коли знаєте, що все завантажено належним чином. Щось на зразок documentReady () або щось подібне.
Codebeat

чому не просто running = 1;в onPageStarted()?
Чолецький

@Choletski Тому, що максимум 1 і число більше 1 не є 1.
Матвій

25

Я також знайшов одне елегантне рішення, але не перевірив його жорстко:

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
Я перевірив це, і він працює чудово. Ви, звичайно, можете викликати його за межами методу onPageFinished і використовувати обробник для перевірки через короткі інтервали - у випадках, якщо ви не хочете розширювати клас WebViewClient.
Гал Ром

1
Я вважаю, що це може бути краще, ніж прийнята відповідь, вам просто потрібно перевірити onError і ви налаштовані.
Evin1_

1
Це має бути прийнятою відповіддю.
زياد

1
Оновлення цього
Хдклс

23

Я спростив код NeTeInStEiN таким чином:

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

        }
 });

Це легко зрозуміти, OnPageFinished, якщо попередній зворотний дзвінок увімкнено onPageStarted, тому сторінка завантажується повністю.


3
@polen PAGE_STARTED ніколи не видаляється? Що робити, якщо ніколи не повинно викликатиOverrideUrlLoading ()?
an00b

20

Якщо ви хочете показати панель прогресу, вам потрібно прослухати подію зміни ходу, а не лише для заповнення сторінки:

mWebView.setWebChromeClient(new WebChromeClient(){

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

                //change your progress bar
            }


        });

BTW, якщо ви хочете відображати лише невизначений ProgressBar, що переосмислює метод onPageFinished, достатньо



5

Ви можете простежити Staus Progress за методом getProgress у класі веб-перегляду .

Ініціалізуйте статус прогресу

private int mProgressStatus = 0;

то 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 (); потрібно викликати з потоку інтерфейсу користувача.
Skynet

5

дякую за відповіді. Це мені допомогло, але мені довелося трохи його вдосконалити для моїх потреб. У мене було кілька зоряних сторінок і закінчень, тому я додав таймер, який перевіряє, чи не починається завершення сторінки, починається нова сторінка. Гаразд, погане пояснення. Дивіться код :)

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

Ось новий метод виявлення, коли URL-адреса завантажена, використовуючи можливості Android для гачків JavaScript . Використовуючи цю схему, ми використовуємо знання JavaScript про стан документа, щоб генерувати вихідний виклик методу під час виконання Android. Ці доступні JavaScript-дзвінки можна здійснювати за допомогою @JavaScriptInterfaceпримітки.

Ця реалізація вимагає, щоб ми зателефонували setJavaScriptEnabled(true)до WebViewналаштувань ', тому вона може не підходити залежно від вимог вашої програми, наприклад, з питань безпеки.

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

По суті, ми додаємо додаткову функцію JavaScript, яка використовується для перевірки стану документа. Якщо він завантажений, ми запускаємо власну onPageLoaded()подію в Android MainActivity; в іншому випадку ми реєструємо слухач подій, який оновлює Android, коли сторінка готова, використовуючи window.addEventListener('onload', ...);.

Оскільки ми додаємо цей скрипт після того, this.getWebView().loadURL("")як був здійснений дзвінок , можливо, нам взагалі не потрібно «слухати» події, оскільки ми отримуємо лише шанс приєднати гачок JavaScript, зробивши послідовний дзвінок на loadURL, щойно сторінку вже завантажено.


Дивовижне рішення, яке, як правило, працює. У мене виникають проблеми з https://reddit.com/r/Nature (звичайно з Reddit), коли ви натискаєте якусь нитку, і нитка завантажується, я не в змозі зловити цю подію. Ви можете мені допомогти?
Primož Kralj

@ PrimožKralj Радий почути, що ти маєш певний успіх у цьому ... Я не впевнений, що конкретно запропонувати, але якщо є якісь публічні події, які, як відомо, спрацьовують, на які ти можеш підключитися, наприклад, коли кількість коментарів оновлена, ви можете використовувати це як джерело. Чи вважали ви, що, можливо, вашу проблему можна вирішити, натиснувши API Reddit безпосередньо?
Mapsy

1
Дякую, я ще раз ознайомлюсь із подіями, які розпочалися, і спробую підключитися до однієї з них. Я знаю про API і буду намагатися реалізувати більш надійне рішення, використовуючи його в майбутньому. Дякую!
Primož Kralj

1

Достатньо лише відобразити панель прогресу, "onPageStarted" та "onPageFinished" методів; але якщо ви хочете мати прапор "is_loading" (разом із переспрямованими сторінками, ...), ці методи можуть виконуватися з не послідовним послідовністю, наприклад, чергою "onPageStarted> onPageStarted> 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" на активність близько, якщо це статична змінна, оскільки діяльність може бути завершена до закінчення сторінки.


0

Завантаження URL-адреси за допомогою SwipeRefreshLayoutта 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

Ось метод, який дозволяє вам зареєструвати Runnableвиконання, щойно завершується завантаження певної веб-адреси. Ми пов'язуємо кожного Runnableз відповідною URL-адресою Stringв а Map, і використовуємо метод WebView's, getOriginalUrl()щоб вибрати відповідний зворотний виклик.

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 або прогрес досягне 100%, тому обидва способи не гарантують вам повне відображення.

Але ви можете зрозуміти з методу OnLoadResource, що вже було надано, а що ще рендерінг. І цей метод називається кілька разів.

        @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

Використовуйте це, воно повинно допомогти.`var currentUrl = "google.com" var partOfUrl = currentUrl.substring (0, currentUrl.length-2)

webView.setWebViewClient (об’єкт: 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.
}

// Ви також повинні замінити інший метод заміщення на помилку, наприклад, onReceiveError, щоб побачити, як всі ці методи викликаються один за одним і як вони ведуть себе під час налагодження з точкою розриву. } `


-1

для користувачів Kotlin:

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

Є маса методів, які ви можете перекрити

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.