287 votes

Comment afficher une boîte de dialogue pour confirmer que l'utilisateur souhaite quitter une activité Android ?

J'ai essayé d'afficher une boîte de dialogue de type "Voulez-vous quitter ?" lorsque l'utilisateur tente de quitter une activité.

Cependant, je n'arrive pas à trouver les crochets API appropriés. Activity.onUserLeaveHint() semblait initialement prometteur, mais je ne trouve pas le moyen d'empêcher l'activité de se terminer.

396voto

jax Points 9006
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    //Handle the back button
    if(keyCode == KeyEvent.KEYCODE_BACK) {
        //Ask the user if they want to quit
        new AlertDialog.Builder(this)
        .setIcon(android.R.drawable.ic_dialog_alert)
        .setTitle(R.string.quit)
        .setMessage(R.string.really_quit)
        .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {

                //Stop the activity
                YourClass.this.finish();    
            }

        })
        .setNegativeButton(R.string.no, null)
        .show();

        return true;
    }
    else {
        return super.onKeyDown(keyCode, event);
    }

}

Dans Android 2.0+, cela ressemblerait à ceci :

@Override
public void onBackPressed() {
    new AlertDialog.Builder(this)
        .setIcon(android.R.drawable.ic_dialog_alert)
        .setTitle("Closing Activity")
        .setMessage("Are you sure you want to close this activity?")
        .setPositiveButton("Yes", new DialogInterface.OnClickListener()
    {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            finish();    
        }

    })
    .setNegativeButton("No", null)
    .show();
}

188voto

chanu sukarno Points 723
@Override
public void onBackPressed() {
    new AlertDialog.Builder(this)
           .setMessage("Are you sure you want to exit?")
           .setCancelable(false)
           .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                    ExampleActivity.this.finish();
               }
           })
           .setNegativeButton("No", null)
           .show();
}

33voto

suraj jain Points 637

J'ai modifié le code de l'utilisateur 919216 et l'ai rendu compatible avec WebView.

@Override
public void onBackPressed() {
    if (webview.canGoBack()) {
        webview.goBack();

    }
    else
    {
     AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Are you sure you want to exit?")
       .setCancelable(false)
       .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
                finish();
           }
       })
       .setNegativeButton("No", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
           }
       });
AlertDialog alert = builder.create();
alert.show();
    }

}

24voto

Toni Gamez Points 401

Je préfère quitter en tapant deux fois sur le bouton de retour plutôt qu'avec une boîte de dialogue de sortie.

Dans cette solution, un toast est affiché lors du premier retour en arrière, avertissant qu'un autre retour en arrière fermera l'application. Dans cet exemple, moins de 4 secondes.

private Toast toast;
private long lastBackPressTime = 0;

@Override
public void onBackPressed() {
  if (this.lastBackPressTime < System.currentTimeMillis() - 4000) {
    toast = Toast.makeText(this, "Press back again to close this app", 4000);
    toast.show();
    this.lastBackPressTime = System.currentTimeMillis();
  } else {
    if (toast != null) {
    toast.cancel();
  }
  super.onBackPressed();
 }
}

Jeton de : http://www.androiduipatterns.com/2011/03/back-button-behavior.html

22voto

GLee Points 981

Si vous n'êtes pas certain que l'appel à "back" quittera l'application ou conduira l'utilisateur vers une autre activité, vous pouvez intégrer les réponses ci-dessus dans une vérification, isTaskRoot(). Cela peut se produire si votre activité principale peut être ajoutée à la pile arrière plusieurs fois, ou si vous manipulez l'historique de votre pile arrière.

if(isTaskRoot()) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Are you sure you want to exit?")
       .setCancelable(false)
       .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
                YourActivity.super.onBackPressed;
           }
       })
       .setNegativeButton("No", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
           }
       });
    AlertDialog alert = builder.create();
    alert.show();

} else {
    super.onBackPressed();
}

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