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?
Vous pouvez utiliser WebViewClient.shouldOverrideUrlLoading pour détecter toutes les modifications d’URL sur votre WebViewClient.
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);
}
}
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);
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.
La méthode onPageFinished semble fonctionner au moins dans les WebViews modernes.
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.
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.
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();
}
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
...