webentwicklung-frage-antwort-db.com.de

Android: Wie onBackPressed () in AlertDialog überschreiben?

Ich habe einen AlertDialog dlgDetails, der von einem anderen AlertDialog dlgMenu stammt. Ich möchte dlgMenu wieder anzeigen können, wenn der Benutzer die Zurück-Schaltfläche in dlgDetails drückt, und den Dialog einfach schließen, wenn er außerhalb des Dialogs drückt.

Ich denke, der beste Weg, dies zu tun, besteht darin, onBackPressed für dlgDetails zu überschreiben, aber ich bin nicht sicher, wie ich das tun soll, da AlertDialogs indirekt mit dem Builder erstellt werden müssen.

Ich versuche, einen abgeleiteten AlertDialog (public class AlertDialogDetails extends AlertDialog { ...}) zu erstellen, aber dann muss ich wohl auch AlertDialog.Builder in dieser Klasse erweitern, um AlertDialogDetails zurückzugeben, aber gibt es keinen einfacheren Weg? Und wenn nicht, wie würden Sie den Builder überschreiben?

20
Pooks

Endlich habe ich meinem Dialog einen Key Listener hinzugefügt, um die Back-Taste anzuhören. Nicht so elegant wie das Überschreiben von onBackPressed(), aber es funktioniert. Hier ist der 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

Eine kürzere Lösung gefunden :) Versuchen Sie Folgendes:

         accountDialog = builder.create();

        accountDialog.setOnCancelListener(new OnCancelListener() {

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

            }
        });
5
Lettings Mall

Dies behandelt sowohl die Schaltfläche ZURÜCK als auch den Klick AUSSERHALB des Dialogs:

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

dialog.cancel() ist der Schlüssel: mit dialog.dismiss() würde dies nur den Klick außerhalb des Dialogs behandeln, wie oben beantwortet.

1
dentex

Ich habe eine neue Funktion in der Java-Klasse erstellt und diese Funktion über die onClick-Methode des Dialogfelds Builder aufgerufen.

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