Android Dialog закрывает вместо отмены - PullRequest
1 голос
/ 29 ноября 2011

У меня возникает следующая проблема в Android 2.2 (API 8):

У меня есть настроенный класс Dialog, подобный этому:

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

И я создаю новый AuthDialog, как это:

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

Я использую отладчик и вижу, что когда я отменяю (используя кнопку «Назад» или нажатие за пределами диалогового окна), приложение закрывает диалоговое окно вместо отмены.

У кого-нибудь была такая проблема с диалогами?

Спасибо заранее.

Ответы [ 3 ]

10 голосов
/ 22 декабря 2011

onDismiss () всегда запускается при закрытии диалога. Документация для setOnCancelListener () гласит: "Это будет вызвано только при отмене диалога, если создатель должен знать, когда он вообще закрывается, используйте setOnDismissListener" , т.е. это не onCancel или onDismiss. но оба, когда диалог отменен. Я согласен, хотя, что это имело бы больше смысла, если бы это было не так.

2 голосов
/ 29 ноября 2011

Предполагая, что этот диалог должен быть модальным, сделайте ваш диалог новым занятием.

0 голосов
/ 29 ноября 2011

setCancelable (false) не позволит кнопке «Назад» делать что-либо.Многие разработчики просто отключают возможность кнопки «Назад» закрывать диалоговое окно, поскольку неясно, является ли это действием отмены или одобрения для пользователя.

...