常規寫法:
builder.setPositiveButton("確認", (dialog, which) -> {
if (input.isEmpty()) { toast("不能為空"); return; } // 對話框已關閉!
doSubmit();
});
點擊瞬間對話框已關閉,Toast 顯示時用戶已失去上下文。
AlertDialog dialog = builder
.setPositiveButton("確認", null) // 不設置 listener
.setNegativeButton("取消", null)
.create();
dialog.show();
// 關鍵:show() 之後獲取 Button 實例,手動設置監聽
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(v -> {
String input = editText.getText().toString().trim();
if (input.isEmpty()) {
Toast.makeText(context, "請輸入內容", Toast.LENGTH_SHORT).show();
return; // 不調用 dismiss(),對話框保持打開
}
doSubmit(input);
dialog.dismiss(); // 校驗通過才手動關閉
});
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(v -> dialog.dismiss());
builder.setPositiveButton 內部預設綁定 dialog.dismiss();null 可禁用預設行為;dialog.show() 後,getButton() 才能拿到實際 Button View;dismiss() 時機,實現「校驗不通過不關閉」。public abstract class ValidatedDialog {
public void show(Context ctx, View contentView) {
AlertDialog dialog = new AlertDialog.Builder(ctx)
.setView(contentView)
.setPositiveButton("確定", null)
.setNegativeButton("取消", null)
.create();
dialog.show();
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(v -> {
if (validate(contentView)) {
onValidated(contentView);
dialog.dismiss();
}
});
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(v -> dialog.dismiss());
}
protected abstract boolean validate(View view);
protected abstract void onValidated(View view);
}
一行代碼改變交互體驗,告別「點擊即關閉」的反模式。