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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top