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

如何修改AlertDialog确定按钮点击后的文本并保持对话框至下载完成?

解决方案

要实现点击确定按钮后修改文本为“loading”并保持对话框不消失,直到下载完成,你需要注意这几个核心点:

  • 不能依赖AlertDialog.Builder默认的按钮点击回调(默认点击后会自动关闭对话框),要手动获取按钮实例并设置自定义点击事件
  • 耗时的下载任务必须放在子线程执行,避免阻塞UI线程
  • UI操作(修改按钮文本、更新图片)必须在主线程执行

下面是修改后的完整代码,注释已翻译成中文:

myButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
        builder.setTitle("你有什么问题?");

        // 设置输入框
        final EditText input = new EditText(v.getContext());
        // 指定输入类型,这里设置为普通文本
        input.setInputType(InputType.TYPE_CLASS_TEXT);
        builder.setView(input);
        input.setText("test test");
        input.setTextSize(15);

        // 设置按钮(先不设置默认点击回调)
        builder.setPositiveButton("确定", null);
        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });

        // 创建并显示对话框
        final AlertDialog dialog = builder.create();
        dialog.show();

        // 获取确定按钮实例,设置自定义点击事件
        final Button positiveBtn = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
        positiveBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View btnView) {
                final String inputText = input.getText().toString();
                
                // 修改按钮文本为"loading",并禁用按钮防止重复点击
                positiveBtn.setText("loading");
                positiveBtn.setEnabled(false);

                // 开启子线程执行下载任务(耗时操作不能在主线程)
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        // 模拟下载图片的耗时操作(这里替换成你的真实下载逻辑)
                        try {
                            Thread.sleep(10000); // 模拟10秒下载
                            // 假设这里已经完成图片下载,得到Bitmap对象
                            // Bitmap downloadedBitmap = downloadImageFromUrl(你的图片URL);

                            // 回到主线程更新UI
                            ((Activity) v.getContext()).runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    // 恢复按钮状态(可选,如果不需要再点击可以省略)
                                    positiveBtn.setText("确定");
                                    positiveBtn.setEnabled(true);
                                    // 关闭对话框
                                    dialog.dismiss();
                                    // 在主页面显示下载的图片
                                    // imageView.setImageBitmap(downloadedBitmap);
                                }
                            });
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                            // 下载出错时也要回到主线程更新UI
                            ((Activity) v.getContext()).runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    positiveBtn.setText("确定");
                                    positiveBtn.setEnabled(true);
                                    Toast.makeText(v.getContext(), "下载失败", Toast.LENGTH_SHORT).show();
                                }
                            });
                        }
                    }
                }).start();
            }
        });
    }
});

关键说明

  • 通过dialog.getButton(AlertDialog.BUTTON_POSITIVE)获取确定按钮实例,这样就能调用setText()修改文本
  • 手动设置按钮的OnClickListener,替代Builder的默认回调,避免对话框自动关闭
  • 下载任务放在子线程,通过runOnUiThread回到主线程执行UI更新操作,符合Android的线程规则
  • 禁用按钮可以防止用户重复点击触发多次下载任务

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 07:35:18