首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android AlertDialog 點擊按鈕後正確關閉:dismiss() vs cancel() 區別

     編輯:程式設計綜合問答

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();

正確代碼:使用參數 dialog


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();

進階:保存 Dialog 引用以便外部控制


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();
        }
    }
}

dismiss() vs cancel() vs hide()

方法行為觸發 OnCancelListener適用場景
dismiss()關閉對話框,從視圖層級移除否正常關閉(按鈕點擊、任務完成)
cancel()關閉對話框,並觸發取消邏輯是用戶按返回鍵、點擊外部、調用 cancel()
hide()隱藏但保持實例,可再次 show()否頻繁切換顯示/隱藏、保持狀態

Kotlin 簡化寫法


AlertDialog.Builder(this)
    .setTitle("提示")
    .setMessage("內容")
    .setPositiveButton("確定") { dialog, which -> 
        dialog.dismiss()
        doSomething()
    }
    .setNegativeButton("取消") { dialog, which -> dialog.dismiss() }
    .setCancelable(false)
    .show()

現代替代:MaterialAlertDialogBuilder


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() 即可,無需外部變量。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved