-1

In my app i am using webview to display some web data, i want to implement a functionality where if a user clicks on any link a new screen (activity) will open and url's data will be displayed in that activity's webview. i have tried setting a webview client to webview and overriding its onPageStarted,shouldOverrideUrlLoading methods but they all open the url within the same screen.

Here is my code

    webview.loadData(html, "text/html; charset=utf-8", "UTF-8");
    webview.setWebViewClient(webViewClient);
}
WebViewClient webViewClient = new WebViewClient() {
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        if (url.startsWith("http://")) {
            Intent intent = new Intent(FirstActivity.this, WebActivity.class);
            intent.putExtra("url", url);
            startActivity(intent);
        }
    }
    @Override
    public void onPageFinished(WebView view, String url) {
    }

    @SuppressWarnings("deprecation")
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
         return false;
    }

    @TargetApi(Build.VERSION_CODES.N)
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {

        return false;
    }

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

How this can be implemented? any help will be appreciated

User
  • 692
  • 2
  • 11
  • 29
  • 1
    *some part of my code* is incomplete, and *Any suggestions* is not a specific question. See [How to Create a Minimal, Complete and Verifiable Example](http://stackoverflow.com/help/mcve) and [ask]. – Ken White Jun 23 '17 at 03:06

3 Answers3

0

Try this:

@SuppressWarnings("deprecation")
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (url.startsWith("http://")) {
        Intent intent = new Intent(FirstActivity.this, WebActivity.class);
        intent.putExtra("url", url);
        startActivity(intent);
        return true;
    }
    return false;
}

@TargetApi(Build.VERSION_CODES.N)
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {

    String url = request.getUrl().toString();
    if (url.startsWith("http://")) {
        Intent intent = new Intent(FirstActivity.this, WebActivity.class);
        intent.putExtra("url", url);
        startActivity(intent);
        return true;
    }
    return false;
}
DucPV
  • 21
  • 2
  • it doesn't starts WebActivity instead it loads that url in webview that is on first activity – User Jun 23 '17 at 05:03
0

Try this. But you first need to set a start website like google.com

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.KeyEvent;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;


public class MainActivity extends Activity {

private WebView view;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    view = (WebView) this.findViewById(R.id.webView);
    view.getSettings().setJavaScriptEnabled(true);
    view.getSettings().setDomStorageEnabled(true);
    view.setWebViewClient(new MyBrowser());
    view.loadUrl("[YOUR_WEBSITE]"); //try js alert
    view.setWebChromeClient(new WebChromeClient()); // adding js alert support

}
private class MyBrowser extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.startsWith("tel:") || url.startsWith("sms:") || url.startsWith("smsto:") || url.startsWith("mailto:") || url.startsWith("mms:") || url.startsWith("mmsto:") || url.startsWith("market:")) {
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity(intent);
            return true;
        }
        else {
            view.loadUrl(url);
            return true;
        }
    }
}

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK) && view.canGoBack()) {
        view.goBack(); //method goback()
        return true;
    }

    return super.onKeyDown(keyCode, event);
    }
}
Steven
  • 1,404
  • 2
  • 16
  • 39
0

If links are external to the site, you could do something like this:

webview.setWebViewClient(new LinkExtWebViewClient());

And then:

public class LinkExtWebViewClient extends WebViewClient {

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

        if(Uri.parse(url).getHost().endsWith(" if your site is www.myurl.com, here you have to insert 'myurl.com' ")) {
            return false;
        }
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        view.getContext().startActivity(intent);
        return true;
    }
}

Let me know if it works :)