如何在返回前序Activity或Activity暂停前弹出确认AlertDialog?
解决返回按钮/Activity暂停前弹出确认对话框的问题
你遇到的这个问题我之前也踩过坑——直接在onPause里弹对话框或者没拦截默认返回行为的话,系统会继续执行页面切换流程,对话框自然会被秒退掉。核心思路是先拦截默认的返回操作,等用户明确选择后再决定是否执行返回,具体可以分两种场景处理:
一、拦截物理返回键的行为
重写Activity的onBackPressed()方法,在这里弹出确认对话框,只有用户点击「是」时才执行默认的返回逻辑:
@Override public void onBackPressed() { // 弹出确认对话框 new AlertDialog.Builder(this) .setTitle("确认返回") .setMessage("确定要回到上一页吗?") .setPositiveButton("是", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 用户确认返回,执行默认的返回操作 super.onBackPressed(); } }) .setNegativeButton("否", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 用户取消,关闭对话框,留在当前页面 dialog.dismiss(); } }) .setCancelable(false) // 禁止点击外部或物理返回键关闭对话框,必须让用户选择 .show(); }
二、处理ActionBar/TopAppBar的返回箭头
如果你的页面有顶部返回箭头(左上角的那个),还要重写onOptionsItemSelected()来拦截这个点击事件,复用同样的对话框逻辑:
// 先把对话框逻辑抽成复用方法,避免重复代码 private void showExitConfirmationDialog() { new AlertDialog.Builder(this) .setTitle("确认返回") .setMessage("确定要回到上一页吗?") .setPositiveButton("是", (dialog, which) -> { // 对于顶部返回箭头,直接调用finish()关闭当前页面即可 finish(); // 如果你用Jetpack Navigation,也可以用findNavController().navigateUp() }) .setNegativeButton("否", (dialog, which) -> dialog.dismiss()) .setCancelable(false) .show(); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { // 拦截顶部返回箭头的点击,弹出确认框 showExitConfirmationDialog(); return true; // 标记事件已处理,不执行默认返回逻辑 } return super.onOptionsItemSelected(item); }
为什么之前的方法无效?
你之前在onPause里弹对话框的问题在于:onPause是Activity已经进入暂停流程时才会调用,系统此时已经在准备切换到前序Activity了,对话框刚弹出来就会被系统的页面切换操作覆盖掉。而上面的方法是在返回操作触发的第一时间就拦截住,让系统暂停返回流程,直到用户做出选择,这样对话框就能正常显示并等待用户交互。
内容的提问来源于stack exchange,提问作者Mokhtar Ghaleb
相关产品推荐
相关产品推荐

