首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Android AlertDialog 按鈕點擊不自動關閉:自定義校驗邏輯實戰

     編輯:Java 相關知識

痛點:setPositiveButton 自動 dismiss 導致校驗失敗無法攔截

常規寫法:

builder.setPositiveButton("確認", (dialog, which) -> {
    if (input.isEmpty()) { toast("不能為空"); return; } // 對話框已關閉!
    doSubmit();
});

點擊瞬間對話框已關閉,Toast 顯示時用戶已失去上下文。

解決方案:手動綁定 OnClickListener

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

一行代碼改變交互體驗,告別「點擊即關閉」的反模式。

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