web-dev-qa-db-fra.com

Cliquer sur les URL ouvre le navigateur par défaut

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, celui-ci doit fonctionner comme un navigateur classique et ouvrir le lien dans le même WebView. Mais cela ouvre-t-il le navigateur par défaut et charge-t-il la page?

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

204
JaVadid

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

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

Vous définissez le WebViewClient de votre WebView à l’aide de la méthode setWebViewClient() .

Si vous examinez le WebView sample dans le SDK , vous trouverez 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;
    }
}
346
Dave Webb

dans certains cas, vous pourriez avoir besoin d'une substitution de onLoadResource si vous obtenez une redirection qui ne déclenche pas la méthode de chargement de l'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);
    }           
}
54
realgt

Officiel documentation dit, cliquez sur un lien dans une WebView pour lancer 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, il suffit de le faire

myWebView.setWebViewClient(new WebViewClient());
25
abbas

Ajoutez ces 2 lignes dans votre code -

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

La méthode boolean shouldOverrideUrlLoading(WebView view, String url) était obsolète dans l'API 24. Si vous prenez en charge de nouveaux périphériques, vous devez 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;
        }
    });
}
8
Chris Stillwell

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

J'écris une application avec Navigation Drawer avec recyclerview et des vues Web, pour garder la navigation Web à l'intérieur de l'application, indépendamment des hyperliens sur lesquels un clic a été fait (sans pour autant 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 relevé WebView.

Voici un exemple de 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");
}}

ainsi, chaque lien cliqué sur le site Web se chargera dans votre WebView. (Utilisation de Android Studio 1.2.2 avec la mise à jour de tous les SDK)

6
Samuele Bolognini