web-dev-qa-db-fra.com

Android: Comment remplacer onBackPressed () dans AlertDialog?

J'ai un AlertDialog dlgDetails qui est montré d'un autre AlertDialog dlgMenu. J'aimerais pouvoir afficher à nouveau dlgMenu si l'utilisateur appuie sur le bouton Précédent dans dlgDetails et quitte simplement la boîte de dialogue s'il appuie en dehors de la boîte de dialogue.

Je pense que la meilleure façon de faire est de remplacer onBackPressed pour dlgDetails, mais je ne suis pas sûr de savoir comment faire cela, car AlertDialogs doit être créé indirectement à l'aide du générateur.

J'essaie de créer un AlertDialog dérivé (public class AlertDialogDetails extends AlertDialog { ...}), mais je suppose que je dois également étendre AlertDialog.Builder dans cette classe pour renvoyer un AlertDialogDetails, mais n'y a-t-il pas un moyen plus simple? Et si non, comment feriez-vous pour surcharger le constructeur?

20
Pooks

J'ai finalement ajouté un écouteur à ma boîte de dialogue pour écouter la touche Retour. Pas aussi élégant que de surcharger onBackPressed() mais cela fonctionne. Voici le code:

dlgDetails = new AlertDialog.Builder(this)
    .setOnKeyListener(new DialogInterface.OnKeyListener() {
        @Override
        public boolean onKey (DialogInterface dialog, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK && 
                event.getAction() == KeyEvent.ACTION_UP && 
                !event.isCanceled()) {
                dialog.cancel();
                showDialog(DIALOG_MENU);
                return true;
            }
            return false;
        }
    })
    //(Rest of the .stuff ...)
57
Pooks

Vous avez trouvé une solution plus courte :) essayez ceci:

         accountDialog = builder.create();

        accountDialog.setOnCancelListener(new OnCancelListener() {

            @Override
            public void onCancel(DialogInterface dialog) {
                dialog.dismiss();
                activity.finish();

            }
        });
5
Lettings Mall

Ceci gère à la fois le bouton BACK et le clic à l’extérieur de la boîte de dialogue:

yourBuilder.setOnCancelListener(new OnCancelListener() {
    @Override
    public void onCancel(DialogInterface dialog) {
        dialog.cancel();
        // do your stuff...
    }
});

dialog.cancel() est la clé: avec dialog.dismiss(), cela ne traiterait que le clic en dehors de la boîte de dialogue, comme indiqué ci-dessus.

1
dentex

J'ai créé une nouvelle fonction dans la classe Java et ai appelé cette fonction à partir de la méthode onClick du générateur de dialogue.

public class Filename extends Activity(){

@Override
onCreate(){
 //your stuff
 //some button click launches Alertdialog
}

public void myCustomDialog(){
 AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
 //other details for builder
      alertDialogBuilder.setNegativeButton("BACK",
            new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
                         dialod.dismiss;
                         myCustomBack();
                    }
      });

 AlertDialog alertDialog = alertDialogBuilder.create();
 alertDialog.setCanceledOnTouchOutside(true);
 alertDialog.show();
}

public void myCustomBack(){
  if(condition1){
    super.onBackPressed();
  }
  if(condition 2){
    //do  stuff here
  }
}

@Override
public void onBackPressed(){
  //handle case here
  if (condition A)
    //Do this
  else 
    //Do that
}

}
0
Deepak Negi