0

I know this has been asked multiple times but I went through all the answers and I just cant get it to work. Im trying to make a simple webview app that handles external links in native browser.

package com.example.app;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private WebView webview;
    private long backPressedTime;

    @Override
    public void onBackPressed() {
        if (webview.canGoBack()) {
            webview.goBack();
        } else {
            if (backPressedTime + 2000 > System.currentTimeMillis()) {
                super.onBackPressed();
                return;
            } else {
                Toast.makeText(getBaseContext(), "Press back again to exit", Toast.LENGTH_SHORT).show();
            }
            backPressedTime = System.currentTimeMillis();
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webview = (WebView) findViewById(R.id.webView);
        webview.setWebViewClient(new WebViewClient());
        webview.getSettings().setJavaScriptEnabled(true);
        webview.getSettings().setDomStorageEnabled(true);
        webview.setOverScrollMode(WebView.OVER_SCROLL_NEVER);
        webview.loadUrl("https://www.myurl.com");
    }

}

Any help would be greatly appreciated. Thank you

1 Answer 1

1

You can override URL loading with following code. If you want to handle URL loading yourself return true. If the URL should be opend in the WebView, return false.

webview.setWebViewClient(new WebViewClient() {
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        // Insert logic here
    }
}

If you just want to open external links you can use following code. In case the opened URL starts with your domain's base URL, false is returned and the URL is opened in the WebView. Otherwise the ACTION_VIEW intent is used to open the URL in the browser and true is returned.

webview.setWebViewClient(new WebViewClient() {
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        // Abort if no URL
        if (url == null || !(url.startsWith("http://") ||
                url.startsWith("https://"))) {
            return false;
        }

        // Abort if internal URL
        if (url.startsWith("http://www.myurl.com") || 
                url.startsWith("https://www.myurl.com")) {
            return false;
        }

        // Open external URL in browser
        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
        return true;
    }
});

Notice: You have to handle "http://..." and "https://...". Because the method might get called for both.

Sign up to request clarification or add additional context in comments.

2 Comments

Thank you for your response. I just don't understand how to implement this code into what i already have. This is way over my head
I have reworked my answer. You have to add the code to your onCreate method, before webview.loadUrl(...);.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.