Quelqu'un sait-il s'il existe un moyen d'intercepter une "page non trouvée" ou une "erreur de chargement de la page" dans WebView?
Selon la documentation Android Android, onReceivedError()
devrait être en mesure d'intercepter. Mais je l'ai testé dans une application que j'ai délibérément donné la mauvaise URL, et cela n'a rien fait .
Je souhaite que mon application puisse afficher mon propre message d'erreur personnalisé si l'URL n'est jamais disponible pour une raison quelconque.
c'est le code qui n'a rien fait:
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
// custom error handling ... show and alert or toast or something
}
Selon la documentation et mon expérience, cela devrait fonctionner très bien. Il vous suffit de définir votre WebClient
avec la méthode surchargée onReceivedError
dans votre WebView.
Voici l'extrait de certaines de mes anciennes applications de test:
WebView wv = (WebView) findViewById(R.id.webView);
wv.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
Log.i("WEB_VIEW_TEST", "error code:" + errorCode);
super.onReceivedError(view, errorCode, description, failingUrl);
}
});
Je l'ai testé et cela fonctionne très bien. Vérifiez vos journaux et voyez quel type d'erreur de code obtenez-vous. J'espère que cela aide.
J'ai essayé d'utiliser onReceivedError à la fois à l'intérieur de shouldOverrideUrlLoading () et à l'extérieur de cette méthode, mais dans WebViewClient. J'ai même essayé à l'extérieur dans la classe d'activité principale. Je n'étais pas satisfait des résultats incohérents. J'ai donc décidé d'utiliser une méthode de test, isOnline (), et d'appeler cela avant d'appeler loadUrl ().
public boolean isOnline() {
ConnectivityManager cm = (ConnectivityManager) getBaseContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo i = cm.getActiveNetworkInfo();
if ((i == null) || (!i.isConnected())) {
Toast toast = Toast.makeText(getBaseContext(),
"Error: No connection to Internet", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.TOP | Gravity.CENTER, 0, 0);
toast.show();
return false;
}
return true;
}
Ensuite, cette onReceivedError se trouve dans le WebViewClient mais en dehors de la méthode overloadurlthingy. Cela semble empêcher systématiquement les pages d'erreur Android stupides et narquoises.
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
if (view.canGoBack()) {
view.goBack();
}
Toast toast = Toast.makeText(getBaseContext(), description,
Toast.LENGTH_SHORT);
toast.setGravity(Gravity.TOP | Gravity.CENTER, 0, 0);
toast.show();
}
Certaines personnes pourraient considérer que cette ressource est lourde. Eh bien, pas lourd comme les applications Android Facebook et Google+. Et pas comme les services Google. Franchement, cela ne me dérange pas d'utiliser un peu de ces applications oxygène. Appelez-moi un mauvais garçon...
N'oubliez pas d'utiliser les deux méthodes onReceivedError car la méthode avec le paramètre de description est obsolète. Nous utilisons cette méthode obsolète pour la prise en charge de l'API 23 ci-dessous. Par conséquent, nous pouvons l'utiliser dans toutes les versions du SDK.
Voici comment je le fais -
webview.setWebViewClient(new WebViewClient() {
@SuppressWarnings("deprecation")
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
try {
webview.stopLoading();
} catch (Exception e) {
e.printStackTrace();
}
if (webview.canGoBack()) {
webview.goBack();
}
showkError();
}
@TargetApi(Android.os.Build.VERSION_CODES.M)
@Override
public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {
// Redirect to deprecated method, so you can use it in all SDK versions
try {
webview.stopLoading();
} catch (Exception e) {
e.printStackTrace();
}
if (webview.canGoBack()) {
webview.goBack();
}
showError();
}
@Override
public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
super.onReceivedHttpError(view, request, errorResponse);
try {
webview.stopLoading();
} catch (Exception e) {
e.printStackTrace();
}
if (webview.canGoBack()) {
webview.goBack();
}
showError();
}
});