web-dev-qa-db-fra.com

Ne naviguez pas vers d'autres pages de WebView, désactivez les liens et les références

J'ai une vue Web dans Android et j'y ouvre une page Web html. Mais c'est plein de liens et d'images, et quand je clique sur l'un d'entre eux, il se charge dans ma vue Web. Je souhaite désactiver ce comportement. Par conséquent, si je clique sur un lien, ne le chargez pas. J'ai essayé cette solution et édité un peu pour moi, mais cela n'a pas fonctionné . Mon code webviewclient:

private boolean loaded = false;

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {

    if(loaded == false){
        view.loadUrl(url);
        loaded = true;
        return true;
    }else{
        return false;
    }

}

Ma mise en œuvre et les paramètres WebView.

WebView wv = (WebView) findViewById(R.id.recipeWv);
    ourWebViewClient webViewClient = new ourWebViewClient();
    webViewClient.shouldOverrideUrlLoading(wv, URLsave);
    wv.setWebViewClient(webViewClient);
    wv.setFocusableInTouchMode(false);
    wv.setFocusable(false);
    wv.setClickable(false);
    WebSettings settings = wv.getSettings();
    settings.setDefaultTextEncodingName("utf-8");

    settings.setLoadWithOverviewMode(true);
    settings.setBuiltInZoomControls(true);

Exemple: si l'utilisateur ouvre dans ma vue Web la page d'accueil StackOverflow et clique sur l'un des liens (comme "Questions"), la vue Web doit rester sur la page d'accueil StackOverflow.

20
Dandelion

Vous devriez enregistrer dans une variable de classe votre URL actuelle et vérifier si elle est identique à celle chargée. Lorsque l'utilisateur clique sur un lien, la shouldOverrideUrlLoading est appelée et vérifie le site Web .

private String currentUrl;

public ourWebViewClient(String currentUrl) {
    this.currentUrl = currentUrl;
}

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (url.equals(currentUrl)) {
        view.loadUrl(url);  
    }
    return true;
}

Important: n'oubliez pas de définir la WebViewClient sur votre WebView.

ourWebViewClient webViewClient = new ourWebViewClient(urlToLoad);
wv.setWebViewClient(webViewClient);
21
Slenkra

Implémenter un WebViewClient et simplement renvoyer true à partir de cette méthode de WebView Client

webView.setWebViewClient(new WebViewClient(){
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        return true;
    }
});
13
Tarun

Si vous voulez ouvrir le lien interne d'une page Web dans une fenêtre différente, alors

Ne pas utiliser  

WebView webView;//Your WebView Object
webView.setWebViewClient(new HelpClient());// Comment this line

B'coz setWebViewClient () method prend en charge l'ouverture d'une nouvelle page dans la même vue Web. Si simple commenter cette ligne.

private class HelpClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (Uri.parse(url).getHost().equals("www.example.com")) {
            // This is my web site, so do not override; let my WebView load the page
            return false;
        }
        // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        startActivity(intent);
        return true;
    }
}

J'espère que cela fonctionnera.

4
Amit Gupta

Vous devez ajouter une ligne de code supplémentaire, telle que so-

webview.loadUrl(url);
webview.setWebViewClient(new MyWebViewClient());

Et ajoutez une classe supplémentaire MyWebViewClient comme ceci-

/* Class for webview client */
class MyWebViewClient extends WebViewClient {

// show the web page in webview but not in web browser
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {

    view.loadUrl(url);

    return true;
}

@Override
public void onPageFinished(WebView view, String url) {
    super.onPageFinished(view, url);
}

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
    super.onPageStarted(view, url, favicon);
}

@Override
public void onLoadResource(WebView view, String url) {
    super.onLoadResource(view, url);

}

}
1
Anirudh

Même moi avions été confrontés au même problème. J'ai résolu ce problème comme ci-dessous

webView.setOnTouchListener(new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        return true;
                    }
                });

Avec des expressions lambda

webView.setOnTouchListener((v, event) -> true);
1
Vinod Pattanshetti

Très similaire à la réponse d'Amit Gupta, mais j'ai trouvé un moyen plus court de le faire.

private String currentUrl;

public CustomWebViewClient(String currentUrl) {
    this.currentUrl = currentUrl;
}

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    return ! url.equals(currentUrl);
}

Une fois ce CustomWebViewClient défini, définissez le client sur la vue Web.

CustomWebViewClient webViewClient = new CustomWebViewClient(urlToLoad);
wv.setWebViewClient(webViewClient);
0
Grace Shao