El diálogo de Android desestima en lugar de cancelar
Pregunta
Tengo el siguiente problema en desarrollo en Android 2.2 (API 8):
Tengo una clase de diálogo personalizada como esta:
public AuthDialog(final Context context, OnDismissListener dismissListener, OnCancelListener cancelListener) {
super(context);
setOnDismissListener(dismissListener);
setOnCancelListener(cancelListener);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.userpassdialog);
setTitle("Enter email and password");
setCancelable(true);
setCanceledOnTouchOutside(true);
authEmail = (EditText) findViewById(R.id.authEmail);
authPass = (EditText) findViewById(R.id.authPass);
alertMessage = (TextView) findViewById(R.id.auth_alert);
Button authButton = (Button) findViewById(R.id.authButton);
View.OnClickListener onClickListener = new View.OnClickListener() {
public void onClick(View v) {
if (checkCredentials())
dismiss();
else
showAlert();
}
};
authButton.setOnClickListener(onClickListener);
}
private void showAlert() {
alertMessage.setText("Wrong user/pass");
authEmail.setText(null);
authPass.setText(null);
}
private boolean checkCredentials() {
// Empty user/pass for now
boolean checkEmail = authEmail.getText().toString().equals("");
boolean checkPassword = authPass.getText().toString().equals("");
return checkEmail && checkPassword;
}
@Override
public void onBackPressed() {
cancel();
}
Y creo un nuevo Authdialog como este:
private void authenticateThenAccept() {
OnDismissListener dismissListener = new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
accept();
}
};
OnCancelListener cancelListener = new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
cancel();
}
};
AuthDialog dialog = new AuthDialog(context, dismissListener, cancelListener);
dialog.show();
}
Estoy usando el depurador y veo que cuando cancelé (usando el botón Atrás o presionando fuera del cuadro de diálogo), la aplicación descarta el cuadro de diálogo en lugar de cancelar.
¿Alguien ha tenido este tipo de problema con los diálogos?
Gracias de antemano.
Solución
Suponiendo que este diálogo debería ser modal, haga de su diálogo una nueva actividad.
Otros consejos
Ondismiss () siempre se dispara cuando se cierra el diálogo. La documentación para setOncancellistener () establece: "Esto solo se invocará cuando se cancele el diálogo, si el Creador necesita saber cuándo se descarta en general, use SetondismIssListener", es decir, no es Oncancel o Ondismiss, sino tanto cuando se cancela un diálogo. Sin embargo, estoy de acuerdo en que habría tenido más sentido si ese no hubiera sido el caso.
SetCancelable (FALSE) evitará que el botón de retroceso haga cualquier cosa. Muchos desarrolladores simplemente apagan la capacidad del botón Atrás para cerrar el diálogo, ya que no está claro si eso es una acción de cancelación o OK para el usuario.