I have a Web View in Android,and I open a html web page in it.But it's full of links and images,and when I click one of them,it loads in my webview. So I want to disable this behavior,so if I click on a link,don't load it. I've tried this solution and edited a bit for myself, but not worked.
Please give me a solution with full code. I'm new to Java and Android.
My Full code here:
public class MainActivity extends AppCompatActivity {
ProgressBar progressBar;
WebView webView;
String url="http://example.com";
TextView textView;
//to hide progressbar after loading part 1
LinearLayout liProgressContainer;
private String currentUrl;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
webView = (WebView) findViewById(R.id.webView);
textView = (TextView) findViewById(R.id.tvLoadingPercentage);
//to hide progressbar after loading part 2
liProgressContainer = (LinearLayout) findViewById(R.id.liProgressContainer);
webView.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
progressBar.setProgress(progress);
textView.setText(progress + " %");
}
});
webView.setWebViewClient(new MyWebViewClient());
WebSettings browserSetting = webView.getSettings();
browserSetting.setJavaScriptEnabled(true);
webView.loadUrl(url);
}
//back button function
#Override
public void onBackPressed() {
if (webView.canGoBack()) {
webView.goBack();
} else {
super.onBackPressed();
}
}
private class MyWebViewClient extends WebViewClient {
#Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
liProgressContainer.setVisibility(View.VISIBLE);
super.onPageStarted(view, url, favicon);
}
#Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//progressBar.setVisibility(View.VISIBLE);
view.loadUrl(url);
return true;
//return super.shouldOverrideUrlLoading(view, url);
}
#Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
liProgressContainer.setVisibility(View.GONE);
//hide header part
}
}
}
You need to configure your shouldOverrideUrlLoading method in your MyWebViewClient class to only load a URL should it match your desired URL. Add a field to your MyWebViewClient class to store a URL and add a single-arg constructor.
private String desiredUrl;
public MyWebViewClient(String url) {
this.desiredUrl = url;
}
In your shouldOverrideUrlLoading method, check to see if the supplied URL is equal to your URL instance variable.
#Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (desiredUrl.equals(url))
view.loadUrl(url);
return true;
}
When setting your web view client, pass your URL argument, e.g.
webView.setWebViewClient(new MyWebViewClient(url));
Related
I'm trying to open an api.whatsapp link from my webpage using the Android web view but I faced the error ERR_UNKNOWN_URL_SCHEME.
I have changed the shouldOverrideUrlLoading method several times trying to fix it but the intent never works. Have someone faced the same problem before?
This is the current version of my code:
public class MainActivity extends AppCompatActivity {
// public static final String TAG = MainActivity.class.getSimpleName();
private WebView mywebView;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mywebView = (WebView) findViewById(R.id.activity_main_webview);
WebSettings webSettings = mywebView.getSettings();
mywebView.loadUrl("https://mypage");
webSettings.setJavaScriptEnabled(true);
mywebView.setWebViewClient(new WebViewClient());
}
public class myWebClient extends WebViewClient {
#Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
#Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//String url = request.getUrl().toString();
if (Uri.parse(url).getHost().equals("https://mypage")) {
return false;
}
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
}
}
Any suggestions?
Add Validating to your shouldOverrideUrlLoading method like:
Patterns.WEB_URL.matcher(url).matches();
I am making an app for WebView with a header progress bar. It is working nicely but after loading the web page, if I click any link on the webpage, the app closes and opens the default browser. But instead, I want to stay in the WebView page after the click and open the new tab on the same page.
How can I do this?
public class MainActivity extends Activity {
private WebView webView;
private EditText urlEditText;
private ProgressBar progress;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// urlEditText = (EditText) findViewById(R.id.urlField);
webView = (WebView) findViewById(R.id.webView);
//webView = new WebView(this);
progress = (ProgressBar) findViewById(R.id.progressBar);
progress.setMax(100);
webView.setWebChromeClient(new MyWebViewClient());
//Button openUrl = (Button) findViewById(R.id.goButton);
String url = "http://amrtube.com/result/index.php";
if (validateUrl(url)) {
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setJavaScriptEnabled(true); // enable javascript
this.webView.getSettings().setAllowFileAccess(true);
this.webView.getSettings().setBuiltInZoomControls(true);
//this.mWebview.getSettings().setSupportZoom(true);
final Activity activity = this;
this.webView.setScrollBarStyle(33554432);
this.webView.setScrollbarFadingEnabled(false);
webView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.MEDIUM);
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
webView.loadUrl(url);
MainActivity.this.progress.setProgress(0);
}
}
private boolean validateUrl(String url) {
return true;
}
private class MyWebViewClient extends WebChromeClient {
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
view.loadUrl(request.toString());
return true;
}
#Override
public void onProgressChanged(WebView view, int newProgress) {
MainActivity.this.setValue(newProgress);
super.onProgressChanged(view, newProgress);
}
}
public void setValue(int progress) {
this.progress.setProgress(progress);
}
}
Replace your line with this
this.mWebView.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
I am using a webview in my android app. Now the issue is in that webview it is opening like a desktop site not like a mobile platform site.
As for example, when I open the page in webview it is being shown like
And the same page when I am opening in web browser it looks like;
Now my question is I want to open the page in my web view like it is in web browser and I have no idea why it is behaving like that.
My webview code is like;
final WebView webview = (WebView)vi.findViewById(R.id.webview);
WebSettings set = webview.getSettings();
set.setJavaScriptEnabled(true);
set.setBuiltInZoomControls(true);
set.setJavaScriptEnabled(true);
set.setDomStorageEnabled(true);
set.setLoadWithOverviewMode(true);
set.setUseWideViewPort(true);
set.setSaveFormData(true);
set.setJavaScriptCanOpenWindowsAutomatically(true);
set.setBuiltInZoomControls(true);
set.setDisplayZoomControls(false);
set.setSupportZoom(false);
set.setDefaultTextEncodingName("utf-8");
WebChromeClient webClient = new WebChromeClient(){
public void onCloseWindow(Window w){
super.onCloseWindow(webview);
System.out.println("Closed");
}
};
webview.setWebChromeClient(webClient);
webview.setWebViewClient(new WebViewClient(){
#Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
{
// Handle the error
}
#Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
view.loadUrl(url);
return true;
}
#Override
public void onPageFinished(WebView view, String url) {
dialog.dismiss();
}
});
webview.setInitialScale(1);
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setLoadWithOverviewMode(true);
webview.loadUrl(url);
I changed the value of webview.setInitialScale(1); but no luck so far.
I can not change the HTML of the pages, so I need to do some kind of changes in webview end.
N.B. The attached images of page is same HTML page opening in browser and webview. PLEASE IGNORE THE BACKGROUND COLOR.
Any help will be very good for me. Thanks in advance.
This works for me
public class MainActivity extends AppCompatActivity {
private WebView webView;
#Override
protected void onCreate(Bundle savedInstanceState) {
getWindow().requestFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.activity_main);
super.onCreate(savedInstanceState);
initViews();
}
protected void initViews() {
webView = (WebView) findViewById(R.id.webView);
if (Build.VERSION.SDK_INT >= 19) {
webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
} else {
webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setDomStorageEnabled(true);
webView.getCertificate();
webView.setWebViewClient(new SSLTolerantWebViewClient());
webView.loadUrl("https://www.google.com");
}
private class SSLTolerantWebViewClient extends WebViewClient {
// ProgressBar progressBar = (ProgressBar) findViewById(R.id.progress_bar);
#Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
Log.d("ddd", "ddd");
return true;
}
#Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
// progressBar.setVisibility(View.GONE);
}
#Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
// progressBar.setVisibility(View.VISIBLE);
}
#Override
public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
handler.proceed();
}
}
}
Is your page responsive ? Try opening page in mobile browser. if it is not responsive make it responsive. Make sure you have added viewport meta tag in html like -
yes I searched the site and didn't find something that helps me
because every one are saying use "shouldOverrideUrlLoading"
but that's not helping me - its not working
I am trying to open - In the same page an URL that supposed to open a new page link, but when I press it - nothing happens
I am using it as a fragment
public class FlightFragment extends Fragment {
private WebView webView;
public FlightFragment(){};
private String currentUrl;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View rootView = inflater.inflate(R.layout.flight_fragment,container,false);
currentUrl = "https://flights.travelor.me/?locale=he";
webView = (WebView)rootView.findViewById(R.id.flightweb);
WebViewClient MyWebViewClient= new WebViewClient();
MyWebViewClient.shouldOverrideUrlLoading(webView, currentUrl);
ourWebViewClient(currentUrl);
webView.getSettings().setLoadsImagesAutomatically(true);
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
webView.setWebViewClient(new FlightFragment.MyBrowser());
webView.getSettings().setUseWideViewPort(true);
webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setSupportZoom(true);
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setDisplayZoomControls(false);
webView.getSettings().setSupportMultipleWindows(true);
webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setJavaScriptEnabled(true);
webView.setOnKeyListener(new View.OnKeyListener() {
#Override
public boolean onKey(View view, int i, KeyEvent keyEvent) {
if (keyEvent.getAction() == keyEvent.ACTION_DOWN) {
if (webView.canGoBack()) {
webView.goBack();
return true;
}
}
return false;
}
});
webView.loadUrl(currentUrl);
return rootView;
}
public void ourWebViewClient(String currentUrl) {
this.currentUrl = currentUrl;
}
private class MyBrowser extends WebViewClient {
#SuppressWarnings("deprecation")
#TargetApi(Build.VERSION_CODES.N)
#Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
if (request.equals(currentUrl)) {
view.loadUrl(request.getUrl().toString());
}
return true;
}
#Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.equals(currentUrl)) {
view.loadUrl(url);
}
return true;
}
}
}
You are returning false when your url is intercepted, try changing like this
webView.setWebViewClient(new WebViewClient() {
class MyWebViewClient extends WebViewClient {
#Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.equals(currentUrl)) {
Intent intent=new Intent(CurrentActivity.this,NewActivity.class);
intent.putExtra("url to load in NewActivity",url);
startActivity(intent); //get this url using getextra in new activity
}
}
}});
If your target version is >= 26
then override both the function below
#TargetApi(Build.VERSION_CODES.N)
#Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
#Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
Because shouldOverrideUrlLoading(WebView view, String url) is deprecated since Android N. Write the code for Android N and above in the first override method.
In your code remove this
webView.setWebViewClient(new WebViewClient() {
class MyWebViewClient extends WebViewClient {
#Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.equals(currentUrl)) {
return false;
}
view.loadUrl(url);
return true;
}
}});
as you are setting your WebViewClient again below this code and change your MyBrowser class
private class MyBrowser extends WebViewClient {
#SuppressWarnings("deprecation")
#Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
#TargetApi(Build.VERSION_CODES.N)
#Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
view.loadUrl(request.getUrl().toString());
return true;
}
}
#golan Try to make your Webview fragment as a Activity which will work like a generic view and will open web pages as per requirement based on input url.
shouldOverrideUrlLoading loading method will required if you want to check the input urls.
Do all required web settings like
WebSettings webSettings = webviewBinding.detailWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setDisplayZoomControls(false);
webSettings.setLoadWithOverviewMode(false);
webSettings.setUseWideViewPort(true);
webSettings.setSupportZoom(true);
Override onBackPressed() method with following code:
if (detailWebView.canGoBack()) {
detailWebView.goBack();
}
else {
super.onBackPressed();
}
The canGoBack() will allow you to go back upto all web pages and if no more pages to go back it will redirect to you to last loaded activity or view.
I need to get a url when user press somethings in a webview.
I use this code:
webView = (WebView) rootView.findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webView.loadUrl("my url");
webView.setWebViewClient(new MyWebClient());
MyWebClien
private class MyWebClient extends WebViewClient {
#Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.e("URL", url);
return true;
}
}
But, if i click something, the event is never called.
Thank you
shouldOverrideUrlLoading(WebView view, String url) will get called on clicking a link on a webview.
usage example:
webView.setWebViewClient(new WebViewClient() {
#Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
try {
// do whatever you want to do on a web link click
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
});
webView.loadUrl("url to open first webpage on a webview");
Based on this: how to get the current page url from the web view in android
WebView webview = new WebView(context);
webview.setWebViewClient(new WebViewClient()
{
#Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
System.out.println("your current url when webpage loading.." + url);
}
#Override
public void onPageFinished(WebView view, String url) {
System.out.println("your current url when webpage loading.. finish" + url);
super.onPageFinished(view, url);
}
#Override
public void onLoadResource(WebView view, String url) {
// TODO Auto-generated method stub
super.onLoadResource(view, url);
}
#Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
System.out.println("when you click on any interlink on webview that time you got url :-" + url);
return super.shouldOverrideUrlLoading(view, url);
}
});