URLのロードを完了するWebViewをリッスンするにはどうすればよいですか?


447

私が持っているWebView、インターネットからページをロードしています。ProgressBar読み込みが完了するまで表示したいです。

のページ読み込みの完了をリッスンするにはどうすればよいWebViewですか?


1
ianがしないいくつかの問題を解決するので、私の答えを正しいものとしてマークすることを検討してください。
neteinstein 2014

ページが読み込まれたときにjsでネイティブJavaコードを呼び出すより良い方法だと思います。これはiOS向けですが、この回答を参照してくださいただし、この考え方はここにも適用されます
Kris Roofe 2017

最小限の簡潔な解決策については、以下の私の答えを確認してください
スカイネット

回答:


715

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/...
ヨハンHoeksma

39
これはまったく解決策ではありません。このメソッドが呼び出されたときにページが既にロードされているという保証はありません。
Hawk

3
これはグーグル側の悪いデザインです。ほとんどの場合、このアクションが完了すると、Webビュー自体ではなく、親アクティビティを中心とした何かを実行する必要があります。イベントをサブスクライブする代わりに関数をオーバーライドすることは一般的なアンチパターンであり、Android開発が嫌いです。
ライアン

6
このメソッドはロードの終了を保証せず、URLロードが中間のURLナビゲーションを取る場合、複数回呼び出すことができます。したがって、これは複数回呼び出されます。しかし、それをチェックする方法です。
初心者

150

@ianこれは100%正確ではありません。ページに複数のiframeがある場合は、複数の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; 
        }
    }
});

更新:

ドキュメントによると、埋め込みフレームのコンテンツが変更された場合、つまりターゲットがiframeであるリンクをクリックした場合、onPageStartedは呼び出されません。

Twitterで、pageFinishedだけが呼び出されてロジックが少し乱れたような特定のケースを見つけました。この問題を解決するために、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のドキュメントの警告に気づいたと思います:埋め込みフレームのコンテンツが変更された場合、つまりターゲットがiframeであるリンクをクリックした場合、onPageStartedは呼び出されません。そのため、これらのケースではロジックが歪む可能性があります。ところで、@ polenの単純化は本当に機能しますか?
an00b

1
ナイスキャッチ、フレームに気づかなかった。私はポーレンのコードを試していません。私が確実にできるのは、使用しているのは上記のコードだけです。
neteinstein 2012年

3
ちょっとした修正。実際には「public void onPageStarted(WebView view、String url)」ではなく「public void onPageStarted(WebView view、String url、Bitmap favicon)」
MrMaffen

ロードが完了しない新しいサイトの一部では機能しません...例: "agoda.com"。リダイレクトであるため、onPageFinished呼び出しを受け取ることはありません。
ケニー

リダイレクト中にonPageFinishedが2回呼び出されるのを見ました。しかし、「ページに複数のiframeがある場合、複数の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
あなたのコードはよさそうだ。urlではなくhtmlデータからロードする私のwebviewにも同じことを試みています。しかし、これは、最初のWebビューがすばやくロードされ、2番目のWebビューがロードを開始する前に、onPageFinishedをトリガーします。通常のシナリオ。実行中= 1、実行中= 2、-実行中= 1、-実行中= 0。失敗する異常なシナリオ-実行中= 1、-実行中= 0、実行中= 1実行中= 0
Ajith Memana '19

1
また、何らかの理由でイベントが発生しない場合に、TODOの部分に到達しないという別のシナリオもあります。したがって、タイムアウトをチェックするタイマーが必要です。または、すべてが正しくロードされていることがわかっている場合は、エクスポートされたjava関数をJavaScriptで呼び出すことができます。documentReady()などのようなもの。
Codebeat

なぜだけrunning = 1;ではないのonPageStarted()ですか?
Choletski

@Choletski 1と1より大きい数の最大値が1ではないため
マシュー

25

私も1つのエレガントなソリューションを見つけましたが、厳密にはテストしていません。

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クラスを拡張したくない場合もあります。
Gal Rom

1
これは受け入れられた答えよりも優れていると思います。onErrorを確認するだけで設定は完了です。
Evin1_

1
これは受け入れられる答えになるはずです。
زياد

1
この投票
Khdkls

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

        }
 });

前のコールバックがonPageStartedにある場合、OnPageFinishedは理解しやすいので、ページは完全に読み込まれます。


3
@polen PAGE_STARTEDがクリアされることはありませんか?shouldOverrideUrlLoading()が呼び出されない場合はどうなりますか?
an00b 2011

20

進行状況バーを表示したい場合は、ページの完了だけでなく、進行状況変更イベントをリッスンする必要があります。

mWebView.setWebChromeClient(new WebChromeClient(){

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

                //change your progress bar
            }


        });

ところで、メソッドonPageFinishedをオーバーライドするIndeterminate ProgressBarだけを表示したい場合は十分です



5

WebViewのgetProgressメソッドでProgress Stausをトレースできますクラスのます。

進行状況を初期化する

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(); UIスレッドから呼び出す必要があります。
スカイネット

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

AndroidのJavaScriptフック機能を利用してURLが読み込まれたことを検出する新しい方法を次に示します。このパターンを使用して、ドキュメントの状態に関する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)で問題が発生しています。スレッドをクリックしてスレッドが読み込まれると、そのイベントをキャッチできません。あなたは私を助けることができます?
プリモジュKralj

@PrimožKraljあなたがこれでいくつかの成功を収めていると聞いてうれしい...私は具体的に何を提案すべきかわからないが、あなたが知っている何らかの種類の公開イベントがトリガーされている場合、たとえばコメント数が更新され、ソースとして利用できます。RedditのAPIに直接アクセスすることで問題を解決できると考えましたか?
Mapsy 2018

1
おかげで、トリガーされたイベントをもう一度見て、それらの1つにフックしてみましょう。私はこのAPIを認識しており、将来的にはそれを使用してより堅牢なソリューションを実装しようとしています。ありがとう!
プリモジュ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

SwipeRefreshLayoutandでURLをロードしてい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、特定のWebアドレスのロードが完了したら実行されるようにを登録できるようにするメソッドです。それぞれRunnableをの対応するURL Stringに関連付けMapWebViewgetOriginalUrl()メソッドを使用して適切なコールバックを選択します。

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

これは役立つはずです。`varcurrentUrl = "google.com" var partOfUrl = currentUrl.substring(0、currentUrl.length-2)

webView.setWebViewClient(object: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
            }
        }

オーバーライドできるメソッドはたくさんあります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.