The shouldOverrideUrlLoading() never gets called if I click a link within the webview.
(It doesn't show the toast or logs anything). I've tried also onPageFinished and it doesn't get called too. I read other posts where users are having problems that this is not called only sometimes, but in my case it's completely ignored.
webview = new WebView(MyActivity.this);
webview.getSettings().setBuiltInZoomControls(true);
webview.getSettings().setDisplayZoomControls(false);
webview.loadData(Html.getHtml(), "text/html", "UTF-8");
webview.getSettings().setJavaScriptEnabled(true);
webview.setWebViewClient(new WebViewClient() {
#Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
new M("shouldOverrideUrlLoading",getApplicationContext());
Log.v("ESSE3", "shouldOverrideUrlLoading()");
System.out.println(url);
System.out.println(Html.getHtml());
webview.loadData(Html.getHtml(), "text/html", "UTF-8");
return true;
}
});
webview.setWebViewClient(new WebViewClient());
setContentView(webview);
Tried with/without javascript enabled or returning true or false within the method.
You call setWebViewClient() twice. Once with your overriding method and once with an empty WebViewClient! That's why your method isn't getting called.
webview.setWebViewClient(new WebViewClient() {
#Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
....
}
});
webview.setWebViewClient(new WebViewClient());
Related
In my app I use a webview to load a payment page of a bank. I need to override some methods of my custom WebViewClient like this:
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient() {
#Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//do some work
return true;
}
});
String postData = "RefId=" + URLEncoder.encode(referenceId);
webView.postUrl(url, postData.getBytes());
problem is in this state, my webView doesn't load the page and instead shows a blank page. But when I remove the overridden method like below, the webView loads the payment URL like a charm!
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient());
String postData = "RefId=" + URLEncoder.encode(referenceId);
webView.postUrl(url, postData.getBytes());
I need to override the method shouldOverrideUrlLoading() or other methods of the client object. What is the problem and the workaround?
UPDATE
So I tried returning false in shouldOverrideUrlLoading() method as Uma Sankar
suggests and now it works.
I have a webview that display the google page and i want to do something when the search button in the google page is pressed is it possible ?
here is my webview :
WebView wb=(WebView) findViewById(R.id.webView);
wb.getSettings().setJavaScriptEnabled(true);
wb.getSettings().setLoadsImagesAutomatically(true);
wb.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
wb.loadUrl("https://www.google.com");
You can use WebViewClient to listen for url changes. It doesn't exactly allow to listen for that specific button, but you can just check the url, like so:
WebView wv = (WebView) findViewById(R.id.webView);
WebSettings ws = wv.getSettings();
ws.setJavaScriptEnabled(true);
WebViewClient wvc = new WebViewClient() {
#Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
boolean isSearch = url.startsWith("https://www.google.com/search");
if (isSearch) {
Log.d("WebView", "search clicked");
return true;
}
return false;
}
};
wv.setWebViewClient(wvc);
wv.loadUrl("https://www.google.com");
I know this is late, but yes you can. You have to set up a JavaScript event listener as a url query to load on Android's side.
..
webView.addJavascriptInterface(new JSInterface(), "SearchClicked");
webView.setWebViewClient(new WebViewClient() {
#Override
public void onPageFinished(WebView view, String url) {
String query =
"document.getElementsByClassName('BwoPOe').item(0).addEventListener('click',
function() {SearchClicked.doTasks()}, false);";
webView.loadUrl("javascript:" + query);
}
});
webView.loadUrl("https://images.google.com/");
..
Here when loading the WebView, you're getting the Google search button by getting a class name called BwoPOe, and setting it's event listener to call the JSInterface method doTasks.
You can find out the button class name using the Chrome's inspect element tool.
private class JSInterface {
#JavascriptInterface
public void boundMethod(String html) {
// do something...
}
}
I have searched and read a lot of posts but can not figure out how to do it in my code.
I want to use geolocation in my app and need to view in webChromeClient in stead of webViewClient which I use for the html files now and the links does stay in the same view.
When I change this to webChromeClient, the html links, like <a href="http://url/file.php?q=123", are suddenly opening in the browser!
How can I prevent this?
myWebView = new WebView(this);
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.getSettings().setLoadWithOverviewMode(true);
myWebView.getSettings().setUseWideViewPort(true);
myWebView.getSettings().setGeolocationEnabled(true);
myWebView.setWebChromeClient(new WebChromeClient() {
public void onGeolocationPermissionsShowPrompt(String origin, android.webkit.GeolocationPermissions.Callback callback) {
callback.invoke(origin, true, false); }
});
myWebView.loadUrl("file:///android_asset/HTML/index.html");
setContentView(myWebView);
WebChromeClient doesn't contain the shouldOverrideUrlLoading method, the WebViewClient does. Remember the "WebView" can and does use both WebViewClient and WebChromeClient at the same time if specified. The WebViewClient adds methods not available to you with no client assigned (keeping navigation in the webview). The same with the WebChromeClient has specific methods it can use (get page title on load for example).
So you can build your code like this:
WebView web = (WebView)findViewById(R.id.web);
WebSettings webSettings = web.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setGeolocationEnabled(true);
webSettings.setSupportMultipleWindows(true); // This forces ChromeClient enabled.
web.setWebChromeClient(new WebChromeClient(){
#Override
public void onReceivedTitle(WebView view, String title) {
getWindow().setTitle(title); //Set Activity tile to page title.
}
});
web.setWebViewClient(new WebViewClient() {
#Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return false;
}
});
I was able to get around this by setting a dummy WebViewClient in addition to the WebChromeClient. Not sure why, but when I take out this line the web page starts opening in the browser again.
mBrowser.setWebViewClient(new WebViewClient());
To open links in the browser you can use an intent in the shouldOverrideUrlLoading method to launch the URL in a browser versus using your webview to handle the link:
webView.setWebViewClient(new WebViewClient(){
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url != null && url.startsWith("http://")) {
view.getContext().startActivity(
new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
return true;
} else {
return false;
}
}
}
If you want to load in the webview use:
WebViewClient yourWebClient = new WebViewClient()
{
// Override page so it's load on my view only
#Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
// This line we let me load only pages with an anchor tag
if ( url.contains("url") == true )
//Load new URL Don't override URL Link
return false;
// Return true to override url loading (In this case do nothing).
return true;
}
};
I'm building my app on webview service and trying to open new url in another window (neither in default system browser nor in same webview). I set up my own WebViewClient and WebChromeClient like below,
public class MyWebViewClient extends WebViewClient {
#Override
public boolean shouldOverrideUrlLoading (WebView view, String url) {
view.loadUrl(url);
return true;
}
}
public class MyWebChromeClient extends WebChromeClient {
#Override
public boolean onCreateWindow (WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
WebView childView = new WebView(view.getContext());
final WebSettings settings = childView.getSettings();
settings.setJavaScriptEnabled(true);
childView.setWebChromeClient(this);
childView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(childView);
resultMsg.sendToTarget();
Log.d(LOG_TAG, "onCreateWindow"); // never log
return true;
}
}
I also definitely had my webview setSupportMultipleWindows to true.
However, onCreateWindow never got called. Is there anything I missed?
Thanks in advance.
Did you tell the "parent" webview that multiple windows are allowed?
WebView parentWebview = (WebView) findViewById(R.id.parent_webview);
// ...
parentWebview.getSettings().setSupportMultipleWindows(true);
That's the most common mistake I've seen.
add this line to code to invoke onCreateWindow()
webView.getSettings().setSupportMultipleWindows(true);
Without the full code its hard to say why OnCreateWindow() isn't being called. In your activity OnCreate() method do you have code similar to the following?
// Get the main web viewer
mWebView = (WebView) findViewById(R.id.webViewer);
// Enable Javascript
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
// Set WebViewClient and WebChromClient
mWebView.setWebViewClient(new MyWebViewClient());
mWebView.setWebChromeClient(new MyWebChromeClient());
Also, what code are you using in which you think the OnCreateWindow() should be called?
There is a WebView which loads mobile-optimized URL (webpage). But when I click on a link, it does not load inside of the WebView (inside of the app), but mobile browser opens.
How to prevent this?
I tried overloading URLs via shouldOverrideUrlLoading(), but it did not help.
This is a code.
webView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = webView.getSettings();
webSettings.setPluginsEnabled(true);
if (Build.VERSION.SDK_INT > 7) {
webSettings.setPluginState(WebSettings.PluginState.ON);
}
webSettings.setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient() {
#Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.equals(url)) {
view.loadUrl(url);
return true;
}
return false;
}
#Override
public void onLoadResource(WebView view, String url) {
}
});
webView.loadUrl("http://some-url.com");
EDIT
Does GET or POST posting methods have anything with links' clicks open mobile web browser???
Return true instead of false in shouldOverrideUrlLoading.
From the documentation:
shouldOverrideUrlLoading returns True if the host application wants to
leave the current WebView and handle the url itself, otherwise return
false.