Cliquer sur les URL ouvre le navigateur par défaut

209

J'ai chargé une URL externe dans mon WebView. Maintenant, ce dont j'ai besoin, c'est que lorsque l'utilisateur clique sur les liens de la page chargée, il doit fonctionner comme un navigateur normal et ouvrir le lien de la même manière WebView. Mais c'est ouvrir le navigateur par défaut et y charger la page?

J'ai activé JavaScript. Mais ça ne marche toujours pas. Ai-je oublié quelque chose?

JaVadid
la source

Réponses:

353

Si vous utilisez un, WebViewvous devrez intercepter les clics vous-même si vous ne voulez pas le comportement Android par défaut.

Vous pouvez surveiller les événements dans un en WebViewutilisant un WebViewClient. La méthode que vous souhaitez est shouldOverrideUrlLoading(). Cela vous permet d'effectuer votre propre action lorsqu'une URL particulière est sélectionnée.

Vous définissez le WebViewClientvotre en WebViewutilisant la setWebViewClient()méthode .

Si vous regardez l' WebViewexemple dans le SDK, il y a un exemple qui fait exactement ce que vous voulez. C'est aussi simple que:

private class HelloWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
}
Dave Webb
la source
97
Il semble que ce soit le comportement par défaut WebViewClientet n'a pas besoin de sous-classement si c'est tout ce que vous faites. Je l'ai fait fonctionner juste en faisantmyWebView.setWebViewClient(new WebViewClient());
Adam
7
@ dave-webb veuillez mettre à jour l'exemple pour ne pas appeler loadUrl. Tout le monde lisant ceci - veuillez ne pas répliquer le code (retournez false à partir du rappel au lieu d'appeler view.loadUrl). L'appel de loadUrl introduit un bug subtil où, si vous avez un iframe dans la page avec une URL de schéma personnalisé (par exemple <iframe src = "tel: 123" />), il naviguera dans le cadre principal de votre application vers cette URL qui cassera probablement l'application comme un effet secondaire.
marcin.kosiba
1
@Adam ++ - oui, je l'ai remarqué aussi - je ne comprenais pas pourquoi une de mes vues Web n'utilisait PAS le navigateur du système, et c'était parce que j'avais ajouté un nouveau client Web qui ne faisait que remplacer une autre méthode. Cela m'a pris un certain temps pour déboguer.
Peter Ajtai
Pouvons-nous implémenter quelque chose comme: onLongClick, ouvrir des liens dans un navigateur externe?
TheOnlyAnil
54

dans certains cas, vous pourriez avoir besoin d'un remplacement de onLoadResource si vous obtenez une redirection qui ne déclenche pas la méthode de chargement d'URL. dans ce cas, j'ai essayé ce qui suit:

@Override
public void onLoadResource(WebView view, String url)
{
    if (url.equals("http://redirectexample.com"))
    {
        //do your own thing here
    }
    else
    {
        super.onLoadResource(view, url);
    }           
}
realgt
la source
C'est bien! Cela m'a fait gagner de nombreuses heures à essayer de comprendre comment lire un fichier MP3 à partir d'un lien dans une vue Web. Merci beaucoup realgt!
Brigante
25

La documentation officielle indique que cliquer sur un lien dans une WebView lancera une application qui gère les URL. Vous devez remplacer ce comportement par défaut

    myWebView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return false;
        }
    });

ou s'il n'y a pas de logique conditionnelle dans la méthode, faites-le simplement

myWebView.setWebViewClient(new WebViewClient());
abbas
la source
15

Ajoutez ces 2 lignes dans votre code -

mWebView.setWebChromeClient(new WebChromeClient()); 
mWebView.setWebViewClient(new WebViewClient());
Embrouiller
la source
9

La méthode a boolean shouldOverrideUrlLoading(WebView view, String url)été déconseillée dans l'API 24. Si vous prenez en charge de nouveaux périphériques, vous devez les utiliser boolean shouldOverrideUrlLoading (WebView view, WebResourceRequest request).

Vous pouvez utiliser les deux en faisant quelque chose comme ceci:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    newsItem.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            view.loadUrl(request.getUrl().toString());
            return true;
        }
    });
} else {
    newsItem.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    });
}
Chris Stillwell
la source
6

La réponse d'Arulx Z était exactement ce que je cherchais.

J'écris une application avec Navigation Drawer avec recyclerview et webviews, pour garder la navigation Web à l'intérieur de l'application sans cliquer sur les hyperliens (donc ne pas lancer le navigateur Web externe). Pour cela il suffira de mettre les 2 lignes de code suivantes:

mWebView.setWebChromeClient(new WebChromeClient()); mWebView.setWebViewClient(new WebViewClient());

exactement sous votre instruction WebView.

Voici un exemple de mon code WebView implémenté:

public class WebView1 extends AppCompatActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    WebView wv = (WebView) findViewById(R.id.wv1); //webview statement
    wv.setWebViewClient(new WebViewClient());    //the lines of code added
    wv.setWebChromeClient(new WebChromeClient()); //same as above

    wv.loadUrl("http://www.google.com");
}}

De cette façon, chaque lien cliqué sur le site Web se chargera dans votre WebView. (Utilisation d'Android Studio 1.2.2 avec tous les SDK mis à jour)

Samuele Bolognini
la source