web-dev-qa-db-fra.com

Android détecte le changement d'URL de la vue Web

J'ai une vue Web dans mon application Android et j'aimerais détecter le changement d'URL. 

Je souhaite l'utiliser pour masquer le bouton d'informations dans la barre supérieure lorsque l'utilisateur se trouve sur la page info.php et l'afficher à nouveau lorsqu'il ne se trouve pas sur la page info.php.

J'ai cherché sur Google mais je ne trouve aucun code fonctionnel. Quelqu'un peut-il m'aider?

14
Daniel

Vous pouvez utiliser WebViewClient.shouldOverrideUrlLoading pour détecter toutes les modifications d’URL sur votre WebViewClient.

9
Rinkal Bhanderi

Pour ceux charge url par javascript. Il y a un moyen de détecter le changement d'URL par JavascriptInterface. Ici, j'utilise youtube par exemple. Utiliser JavaScriptInteface a un problème asynchrone, heureusement ce n'est qu'un rappel ici, donc ce serait moins problématique. Notez que l'annotation @javascriptinterface doit exister.

{
    youtubeView.getSettings().setJavaScriptEnabled(true);
    youtubeView.setWebViewClient(mWebViewClient);
    youtubeView.addJavascriptInterface(new MyJavaScriptInterface(),
            "Android");
    youtubeView.loadUrl("http://www.youtube.com");

}

WebViewClient mWebViewClient = new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
        view.loadUrl("javascript:window.Android.onUrlChange(window.location.href);");
    };
};

class MyJavaScriptInterface {
    @JavascriptInterface
    public void onUrlChange(String url) {
        Log.d("hydrated", "onUrlChange" + url);
    }
}
12
Shu Zhang

si vous remplacez cette méthode de WebViewClient, vous pourrez gérer les modifications d'URL et les modifications d'URL javascript:

public class YXWebViewClient extends WebViewClient {

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
    super.onPageStarted(view, url, favicon);
    Log.i("Listener", "Start");

}

@Override
public void onPageFinished(WebView view, String url) {
    super.onPageFinished(view, url);
    Log.i("Listener", "Finish");
   }

}

puis, dans votre WebView, définissez le WebViewClient

 yxWebViewClient = new YXWebViewClient();
 webview.setWebViewClient(yxWebViewClient);
4
Vins

Essayez d'utiliser onLoadResource. Il sera appelé au moins 1 fois, même si vous utilisez JS pour modifier votre URL. Mais cela peut être appelé plus d’une fois, alors faites attention.

2
user2281646

La méthode onPageFinished semble fonctionner au moins dans les WebViews modernes.

2
beefeather

J'ai eu le même problème. J'ai donc résolu ce problème en redéfinissant la méthode public void onPageStarted(WebView view, String url, Bitmap favicon) comme suit:

 webView.setWebViewClient(new WebViewClient(){

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon)
    {
        // Here you can check your new URL.
        Log.e("URL", url);
        super.onPageStarted(view, url, favicon);
    }

 });

Vous pouvez également remplacer la méthode public void onPageFinished(WebView view, String url) pour obtenir une nouvelle URL à la fin du processus de chargement de la page.

1
Rahim Rahimov

J'ai eu un problème intéressant qui m'a amené à cette question et heureux de fournir une solution qui peut aider quelqu'un d'autre si ils viennent de cette façon en raison d'une recherche googlebingyahoo.

mwebVew.reload () ne prendrait pas la nouvelle URL que je voulais charger une fois que je revenais d'un écran de préférences dans lequel j'étais connecté à l'utilisateur ou déconnecté de l'utilisateur. Il mettrait à jour les préférences partagées assez bien mais pas pour mettre à jour et remplacer la page Web URL. Donc, après quelques heures sans voir de réponse, j’essayais ce qui suit et c’était un vrai régal.

mWebView.resumeTimers();

Voici le lien vers le doco si vous voulez plus d’informations.

J'espère que cela épargnera à quelqu'un d'autre la douleur que j'ai vécue et heureux que quelqu'un me dise que je devrais le mettre en œuvre d'une autre manière.

1
timv

Cela aidera à détecter les redirections causées par javascript. 

WebViewClient mWebViewClient = new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
            view.loadUrl("javascript:window.Android.onUrlChange(window.location.href);");            }
    };
    myWebView.setWebViewClient(mWebViewClient);
    }
@JavascriptInterface
public void onUrlChange(String url) {
    Toast.makeText(mContext, "Url redirected",Toast.LENGTH_SHORT).show();
}
0
Chris Harris

J'ai utilisé cette méthode:

webView.setWebChromeClient(new WebChromeClient()
        {
            @Override public void onProgressChanged(WebView view, int newProgress) {
                if (view.getUrl().equals(mUrl))
                {

                }
                else
                {
                    mUrl = view.getUrl();
                    // onUrlChanged(mUrl) // url changed
                }
                super.onProgressChanged(view, newProgress);
            }
        };
);

mUrl est un champ comme String...

0
Richi