AlertDialog 點擊按鈕後默認不會自動關閉,需在 OnClickListener 中顯式調用 dialog.dismiss()。常見錯誤是調用 dlgAlert.dismiss() 但 dlgAlert 是 Builder 而非 Dialog 實例。
AlertDialog.Builder dlgAlert = new AlertDialog.Builder(this);
// ... 設置內容 ...
dlgAlert.setPositiveButton(R.string.yesdev, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// ❌ 錯誤:dlgAlert 是 Builder,無 dismiss() 方法
dlgAlert.dismiss();
}
});
dlgAlert.create().show();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(getString(R.string.dialogMSG));
builder.setTitle("App Support Checker");
builder.setPositiveButton(R.string.yesdev, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// ✅ 正確:dialog 參數即為當前 Dialog 實例
dialog.dismiss();
// 執行業務邏輯...
}
});
builder.setCancelable(false);
builder.create().show();
public class MyActivity extends AppCompatActivity {
private AlertDialog currentDialog; // 成員變量持有引用
private void showDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("確定刪除?");
builder.setPositiveButton("刪除", (dialog, which) -> {
dialog.dismiss();
performDelete();
});
builder.setNegativeButton("取消", (dialog, which) -> dialog.dismiss());
currentDialog = builder.create();
currentDialog.show();
}
@Override
protected void onDestroy() {
super.onDestroy();
// 防止 Activity 銷毀時 Dialog 洩漏
if (currentDialog != null && currentDialog.isShowing()) {
currentDialog.dismiss();
}
}
}
| 方法 | 行為 | 觸發 OnCancelListener | 適用場景 |
|---|---|---|---|
| dismiss() | 關閉對話框,從視圖層級移除 | 否 | 正常關閉(按鈕點擊、任務完成) |
| cancel() | 關閉對話框,並觸發取消邏輯 | 是 | 用戶按返回鍵、點擊外部、調用 cancel() |
| hide() | 隱藏但保持實例,可再次 show() | 否 | 頻繁切換顯示/隱藏、保持狀態 |
AlertDialog.Builder(this)
.setTitle("提示")
.setMessage("內容")
.setPositiveButton("確定") { dialog, which ->
dialog.dismiss()
doSomething()
}
.setNegativeButton("取消") { dialog, which -> dialog.dismiss() }
.setCancelable(false)
.show()
implementation "com.google.android.material:material:1.9.0"
// 使用 Material 風格
new MaterialAlertDialogBuilder(this)
.setTitle("標題")
.setMessage("內容")
.setPositiveButton("確認", (dialog, which) -> dialog.dismiss())
.show();
記住:OnClickListener 參數 dialog 才是真正的 Dialog 實例,直接調用 dialog.dismiss() 即可,無需外部變量。