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?
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 ...)
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();
}
});
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.
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
}
}