【问题标题】:onBackPressed doesn't work with AlertDialogonBackPressed 不适用于 AlertDialog
【发布时间】:2017-03-04 18:02:28
【问题描述】:

我的代码显示一个 AlertDialog,它通过按下肯定按钮退出活动。我希望它也能够在后退按钮上退出。但是当我有 .setCancelable(false) 时,我的 onBackPressed 不起作用。如何在不将其更改为 .setCancelable(true)

的情况下解决此问题
// show in dialog
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("BROADCAST")
            .setMessage(text)
            .setCancelable(false)
            .setPositiveButton("Dismiss",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            finish();
                        }
                    });
    AlertDialog alert = builder.create();
    alert.show();
}

@Override
public void onBackPressed() {
    finish();
}

【问题讨论】:

  • 如果对话框打开了,您想在后按时关闭活动吗?
  • 是的,这正是我想要的
  • 完成替换为驳回
  • 如果你没有设置 set cancelable 为 true,当用户按下返回按钮时,activity 将永远不会收到 onbackpressed 回调。我想知道真的有办法做到这一点
  • 我遇到了同样的问题。但我在 Kotlin 编程。如果有人使用 Kotlin,我的问题会对他/她有所帮助:stackoverflow.com/questions/60462748/…

标签: android android-alertdialog


【解决方案1】:

轻松愉快..

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("BROADCAST")
        .setMessage(text)
        .setCancelable(true)
        .setPositiveButton("Dismiss",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        finish();
                    }
                })
        .setOnDismissListener(new DialogInterface.OnDismissListener() {
                                @Override
                                public void onDismiss(DialogInterface dialog) {
                                    finish();
                                }
                            });
AlertDialog alert = builder.create();
alert.setCanceledOnTouchOutside(false);
alert.show();

关于 Kotlin 的答案请看这里:Not working onbackpressed when setcancelable of alertdialog is false

【讨论】:

  • 为什么不赞成他想关闭活动,无论是正面按钮还是后按,这段代码做同样的事情。只需设置cancelable(true)...它会在解雇时收到...和setCanceledOnTouchOutside(false);
  • 我实际上是在尝试做与您完全相同的事情,但我被错误炸毁了。我不明白为什么人们如此无知。这是正确的解决方案。
  • 因为我操纵了你想要setCancelable(false) 的答案。我成功了setCancelable(true)。他们对我投了反对票
  • 在问题中提到如何在没有 setcancelable(true) 的情况下实现这一点......我猜反对票是因为这个......但是你的答案是正确的。我不明白这个答案是如何被接受的。根据问题,@Majeed khan 的回答似乎很有说服力
  • @7383 我的回答确实满足了他的需求。他问了错误的问题,他的问题应该是关闭活动,无论是单击肯定按钮还是关闭对话框。
【解决方案2】:

你可以设置一个关键的监听器

builder.setOnKeyListener(new DialogInterface.OnKeyListener() {
                @Override
                public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {

                    if(keyCode == KeyEvent.KEYCODE_BACK){
                        dialog.dismiss(); // dismiss the dialog
                       YourActivity.this.finish(); // exits the activity

                    }

                    return true;
                }
            })

【讨论】:

  • 这不是它的工作原理,对话框可以覆盖后退按钮和onBackPressed
  • 它可能会工作,但不是在显示 AlertDialog 时
  • 如果你想退出活动,你可以通过获取活动实例并在实例上调用 finsih() 来简单地做到这一点
  • 还有一件事! AlertDialog 不会覆盖 onBackPressed!它被活动本身覆盖。
  • 我遇到了同样的问题。但我在 Kotlin 编程。如果有人使用 Kotlin,我的问题会对他/她有所帮助:stackoverflow.com/questions/60462748/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-05
  • 2020-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多