【问题标题】:Android Dialog dismisses instead of cancelAndroid 对话框关闭而不是取消
【发布时间】:2012-01-08 08:29:51
【问题描述】:

我在 android 2.2 (API 8) 中开发时遇到以下问题:

我有一个这样的自定义对话框类:

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

我正在使用调试器,我看到当我取消(使用后退按钮或在对话框外按下)时,应用程序会关闭对话框而不是取消。

有人遇到过这样的对话框问题吗?

提前致谢。

【问题讨论】:

    标签: android dialog dismiss


    【解决方案1】:

    onDismiss() 总是在对话框关闭时触发。 setOnCancelListener() 的文档说明:“这只会在对话框被取消时调用,如果创建者需要知道它何时被解除,请使用 setOnDismissListener”,即它不是 onCancel 或onDismiss 但两者都在取消对话框时。我同意,如果不是这样的话会更有意义。

    【讨论】:

      【解决方案2】:

      假设这个对话框应该是模态的,让你的对话框成为一个新的活动。

      【讨论】:

      • 恕我直言,看起来有点矫枉过正。 Kalle 的回答解释了正在发生的事情;处理该事实的一种方法是取消设置一个标志,以便解雇知道这是一个取消。
      【解决方案3】:

      setCancelable(false) 将阻止后退按钮执行任何操作。许多开发人员只是关闭了后退按钮关闭对话框的功能,因为不清楚这对用户来说是取消还是确定。

      【讨论】:

      • 不。我禁用了后退按钮,创建了一个取消按钮,但它仍然关闭了对话框。
      猜你喜欢
      • 1970-01-01
      • 2015-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-09
      • 2018-04-11
      相关资源
      最近更新 更多