显示AlertDialog时返回按钮失效,需点击返回销毁当前页面
解决AlertDialog显示时返回按钮无法销毁页面的问题
我明白你的困扰:当AlertDialog弹出时,按下返回键没法触发页面销毁,这是因为你设置了builder.setCancelable(false)——这个配置会让Dialog拦截所有返回键事件,根本不会传递给Activity的onBackPressed()方法,自然没法执行销毁逻辑。
下面给你两种可行的解决方案,你可以根据需求选择:
方案一:监听Dialog的返回键事件,直接处理销毁逻辑
即使保持setCancelable(false),我们也可以给Dialog添加按键监听器,捕获返回键事件并执行销毁操作:
private void showPopupSubscribe() { AlertDialog.Builder builder = new AlertDialog.Builder(this); View dialogView = getLayoutInflater().inflate(R.layout.paket_subscribe, null); builder.setView(dialogView); builder.setCancelable(false); builder.setIcon(R.drawable.logo_1); builder.setTitle(R.string.your_title); AlertDialog dialog = builder.create(); dialog.show(); // 添加返回键监听 dialog.setOnKeyListener(new DialogInterface.OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { // 仅处理返回键的抬起事件,避免重复触发 if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) { // 先关闭Dialog dialog.dismiss(); // 销毁当前Activity finish(); return true; // 标记事件已处理,不再传递 } return false; } }); }
这种方式的好处是,既保持了Dialog无法被手动取消(除了返回键),又能在按下返回键时同时关闭Dialog并销毁页面。
方案二:允许Dialog取消,关闭时自动销毁页面
如果你可以接受Dialog被返回键关闭,那么可以把setCancelable(false)改成true,然后通过OnDismissListener在Dialog关闭后销毁Activity:
private void showPopupSubscribe() { AlertDialog.Builder builder = new AlertDialog.Builder(this); View dialogView = getLayoutInflater().inflate(R.layout.paket_subscribe, null); builder.setView(dialogView); builder.setCancelable(true); // 允许Dialog被取消 builder.setIcon(R.drawable.logo_1); builder.setTitle(R.string.your_title); AlertDialog dialog = builder.create(); dialog.show(); // 监听Dialog关闭事件 dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { // 销毁当前Activity finish(); } }); }
这种方式更简洁,适合不需要强制锁定Dialog的场景,用户按下返回键会先关闭Dialog,随后自动销毁页面。
另外提醒一下,你的onBackPressed()方法本身是没问题的,但只有当没有Dialog拦截返回键时才会被触发,所以上面的方案都是针对Dialog拦截的情况做的补充处理。
内容的提问来源于stack exchange,提问作者Asqa
相关产品推荐
相关产品推荐

