Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Don't navigate to other pages in WebView,disable links and references

I have a webView in Android, and I open a html webpage in it. But it's full of links and images, and when I click one of them, it loads in my webview. I want to disable this behaviour, so if I click on a link, don't load it. I've tried this solution and edited a bit for myselft, but not worked. My webviewclient code:

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;
    }

}

My webview implementation and settings.

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);

Example: If the user open in my webview the StackOverflow homepage and clicks on one of the links(like "Questions") then the webview should stay on the StackOverflow homepage.

like image 239
Dandelion Avatar asked Oct 17 '13 12:10

Dandelion


5 Answers

You should save in a class variable your current url and check if it's the same with the loaded one. When the user clicks on a link the shouldOverrideUrlLoading is called and check the website. Something like this:

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: don't forget set the WebViewClient to your WebView.

ourWebViewClient webViewClient = new ourWebViewClient(urlToLoad);
wv.setWebViewClient(webViewClient);
like image 68
Slenkra Avatar answered Nov 15 '22 00:11

Slenkra


Implement a WebViewClient and Just return true from this method of WebView Client

webView.setWebViewClient(new WebViewClient(){
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        return true;
    }
});
like image 23
Tarun Deep Attri Avatar answered Nov 14 '22 23:11

Tarun Deep Attri


If you want to open inner link of a web page in different window then

Don't use

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

B'coz setWebViewClient() method is taking care of opening a new page in the same webview. So simple comment this line.

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;
    }
}

Hope this will work.

like image 5
Amit Gupta Avatar answered Nov 14 '22 22:11

Amit Gupta


Even I had been facing the same issue. I solved this issue like below

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

With lambda expressions

webView.setOnTouchListener((v, event) -> true);
like image 3
Vinod Pattanshetti Avatar answered Nov 15 '22 00:11

Vinod Pattanshetti


Note that the method signature changed in API 24.

For APIs earlier than 24 the second parameter is String and that signature is now deprecated.

For APIs 24 and later, the second parameter is WebResourceRequest.

If your app supports both pre and post API 24 and you want to disable all links you can use this:

  webView.setWebViewClient(new WebViewClient(){
        @Override //for APIs 24 and later
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request){ 
           return true; 
        }
        @Override //for APIs earlier than 24
        public boolean shouldOverrideUrlLoading(WebView view, String url){
            return true;
        }
    });
like image 2
smitty1 Avatar answered Nov 15 '22 00:11

smitty1