用戶按返回鍵關閉 Dialog 時,同時調用 Activity.finish() 關閉頁面。
Dialog dialog = new Dialog(this);
// ... 設置內容、標題等
dialog.setOnCancelListener(dialogInterface -> {
// 用戶按返回鍵、點擊外部、調用 cancel() 時觸發
MyActivity.this.finish();
});
dialog.show();
setOnCancelListener 捕獲所有取消途徑:返回鍵、點擊對話框外部 (若 setCanceledOnTouchOutside(true))、代碼調用 dialog.cancel()Dialog.dismiss() 不觸發 OnCancelListener,僅觸發 OnDismissListener
public class ConfirmExitDialogFragment extends DialogFragment {
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(requireActivity())
.setTitle("確認退出")
.setMessage("確定要離開嗎?")
.setPositiveButton("確定", (dialog, which) -> {
requireActivity().finish();
})
.setNegativeButton("取消", null)
.create();
}
// 返回鍵觸發 cancel -> onCancel -> finish
@Override
public void onCancel(@NonNull DialogInterface dialog) {
super.onCancel(dialog);
requireActivity().finish();
}
}
// 使用
new ConfirmExitDialogFragment().show(getSupportFragmentManager(), "exit_dialog");
| 監聽器 | 觸發時機 | 典型用途 |
|---|---|---|
| OnCancelListener | 用戶主動取消 (返回鍵、點外部、cancel()) | 業務邏輯回滾、埋點統計「用戶放棄」 |
| OnDismissListener | 對話框消失時 (dismiss()、cancel()、系統銷毀) | 資源釋放、解除註冊、通用清理 |
onBackPressed() 中手動判斷 Dialog 顯示狀態 → 易漏情況、代碼分散onBackPressed() (Dialog 無此方法) → 編譯錯誤dialog.setOnCancelListener(() -> activity.finish()) → 統一、簡潔、語義正確DialogFragment + onCancel → 生命周期安全、配置變更存活