46 votes

Détection d'erreur d'affichage Web et message d'affichage

J'aimerais afficher un message d'erreur en cas d'erreur lors du chargement d'une page Webview (Pas de connexion). Voici ce que j'ai jusqu'à présent, sans le code de gestion des erreurs :

 public class TrackerPage extends Activity {

    // @Override
    private WebView webview;
    private ProgressDialog progressDialog;

    private boolean error;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Get rid of the android title bar
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        // Set the XML layout
        setContentView(R.layout.tracker_page);

        // Bundle objectbundle = this.getIntent().getExtras();
        webview = (WebView) findViewById(R.id.tracker);

        final Activity activity = this;

        // Enable JavaScript and lets the browser go back
        webview.getSettings().setJavaScriptEnabled(true);
        webview.canGoBack();

        webview.setWebViewClient(new WebViewClient() {
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }

            public void onLoadResource(WebView view, String url) {
                // Check to see if there is a progress dialog
                if (progressDialog == null) {
                    // If no progress dialog, make one and set message
                    progressDialog = new ProgressDialog(activity);
                    progressDialog.setMessage("Loading please wait...");
                    progressDialog.show();

                    // Hide the webview while loading
                    webview.setEnabled(false);
                }
            }

            public void onPageFinished(WebView view, String url) {
                // Page is done loading;
                // hide the progress dialog and show the webview
                if (progressDialog.isShowing()) {
                    progressDialog.dismiss();
                    progressDialog = null;
                    webview.setEnabled(true);
                }
            }

        });

        // The URL that webview is loading
        webview.loadUrl("http://url.org/");
    }
}

Comment ferais-je cela ?

39voto

Harsh Mittal Points 2490

Toutes les réponses ci-dessus sont obsolètes. Vous devez utiliser ce code après la fin de la page

  @Override
    public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error){
           //Your code to do
        Toast.makeText(getActivity(), "Your Internet Connection May not be active Or " + error.getDescription(), Toast.LENGTH_LONG).show();
    }

30voto

kabuko Points 23166

Vous êtes presque arrivé là-bas... Implémentez simplement onReceivedError et gérez les erreurs que vous souhaitez.

18voto

Yahyaotaif Points 750

Ajoutez ceci après onpagefinished :

     public void onReceivedError(WebView view, int errorCod,String description, String failingUrl) {
            Toast.makeText(Webform.this, "Your Internet Connection May not be active Or " + description , Toast.LENGTH_LONG).show();
        }

N'oubliez pas d'importer android.widget.Toast ;

10voto

Hitesh Sahu Points 12561

Réponse mise à jour selon API 23 Marshmallow

Gestion des erreurs WebViewClient

     /*
     * Added in API level 23 replacing :-
     *
     * onReceivedError(WebView view, int errorCode, String description, String failingUrl) 
    */
    @Override
    public void onReceivedError(WebView view, WebResourceRequest request,
            WebResourceError error) {

        Toast.makeText(getActivity(),
                "WebView Error" + error.getDescription(),
                Toast.LENGTH_SHORT).show();

        super.onReceivedError(view, request, error);

    }

    /*
      Added in API level 23
    */
    @Override
    public void onReceivedHttpError(WebView view,
            WebResourceRequest request, WebResourceResponse errorResponse) {

        Toast.makeText(getActivity(),
                "WebView Error" + errorResponse.getReasonPhrase(),
                Toast.LENGTH_SHORT).show();


        super.onReceivedHttpError(view, request, errorResponse);
    }

Gestion des erreurs de réseau

         webView.loadUrl(urlToLoad);

        if (!isConnected(getActivity())) {
            Toast.makeText(getActivity(), "You are offline ", Toast.LENGTH_SHORT).show();

        }

     /**
     * Check if there is any connectivity
     * 
     * @param context
     * @return is Device Connected
     */
    public static boolean isConnected(Context context) {

        ConnectivityManager cm = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);

        if (null != cm) {
            NetworkInfo info = cm.getActiveNetworkInfo();

            return (info != null && info.isConnected());
        }
        return false;
    }

8voto

V. Kalyuzhnyu Points 1515
public class WebClient extends WebViewClient {

    @Override
    @TargetApi(Build.VERSION_CODES.M)
    public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
        super.onReceivedError(view, request, error);
        final Uri uri = request.getUrl();
        handleError(view, error.getErrorCode(), error.getDescription().toString(), uri);
    }

    @SuppressWarnings("deprecation")
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
        super.onReceivedError(view, errorCode, description, failingUrl);
        final Uri uri = Uri.parse(failingUrl);
        handleError(view, errorCode, description, uri);
    }

    private void handleError(WebView view, int errorCode, String description, final Uri uri) {
        final String host = uri.getHost();// e.g. "google.com"
        final String scheme = uri.getScheme();// e.g. "https"
        // TODO: logic
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X