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?
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;
}
}
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);
}
}
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());
Ajoutez ces 2 lignes dans votre code -
mWebView.setWebChromeClient(new WebChromeClient());
mWebView.setWebViewClient(new WebViewClient());
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;
}
});
}
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)