You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Material UI对话框:点击确定按钮时保持弹窗不关闭

实现AlertDialog点击确定按钮不关闭的方法

核心问题分析

默认情况下,setPositiveButton设置的点击监听器会在执行后自动触发对话框关闭逻辑,再加上你原代码中主动调用了dialog.dismiss(),这两个原因导致弹窗被强制关闭。

解决方案步骤

  • 初始化Dialog时,将PositiveButton的点击监听器设为null,避免系统自动触发关闭行为。
  • 手动获取Dialog的PositiveButton实例,自定义点击事件,仅在验证码验证成功时调用dialog.dismiss()关闭弹窗。

修改后的完整代码

MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getContext())
        .setTitle("Verifikasi email")
        .setIcon(R.drawable.icons8_checkmark)
        .setMessage("message")
        .setView(viewDig)
        .setPositiveButton("OK", null); // 先设置空监听器,规避系统自动关闭逻辑

builder.setCancelable(false);
AlertDialog dialog = builder.show();

// 获取确定按钮并设置自定义点击逻辑
Button positiveButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
positiveButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 拼接输入的验证码
        StringBuilder sb = new StringBuilder();
        for (EditText editText : editTexts) {
            sb.append(editText.getText().toString());
        }
        String verNum = sb.toString();

        if (verNum.equals(activation)){
            // 验证成功,执行业务逻辑后关闭弹窗
            dialog.dismiss();
            // 此处添加验证成功后的操作
        }else{
            // 验证失败,保留弹窗并给出提示
            Toast.makeText(getContext(), "验证码错误,请重新输入", Toast.LENGTH_SHORT).show();
            // 可选:清空输入框并将焦点移至第一个输入框
            for (EditText editText : editTexts) {
                editText.setText("");
            }
            if (!editTexts.isEmpty()) {
                editTexts[0].requestFocus();
            }
        }
    }
});

补充说明

这种方式完全掌控了对话框的关闭时机,只有在验证码验证通过时才会关闭弹窗;验证失败时可以保留弹窗状态,同时给出明确的错误提示,优化用户输入体验。

内容的提问来源于stack exchange,提问作者NewbieMF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 15:40:08