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

如何关闭作为Activity的自定义对话框并从中获取数据?

解决方案

嘿,我来帮你搞定这两个需求!你的自定义对话框是用Dialog主题的Activity实现的,这其实是个很灵活的方案,下面一步步来实现你要的功能:

1. 点击Cancel按钮关闭对话框

因为你的TextDialogActivity本质就是一个Activity(只是套了Dialog主题),所以关闭它只需要调用finish()方法就行。你只需要在两个Cancel按钮的点击事件里添加这行代码:

cancel_button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 关闭当前对话框Activity
        finish();
    }
});

cancel_button2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        finish();
    }
});

这样点击任意一个Cancel按钮,对话框就会关闭啦。

2. 点击Save按钮传递textData给父Activity

首先你需要在text_dialog_layout布局里添加一个Save按钮(比如给它设置id为save_button),然后回到TextDialogActivity里完成数据传递的逻辑:

步骤1:在TextDialogActivity中处理Save按钮点击

我们用Intent来携带数据,通过setResult()把结果返回给启动它的MainActivity,代码如下:

// 先添加Save按钮的成员变量
private Button save_button;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.text_dialog_layout);
    // ... 其他已有的初始化代码 ...
    
    // 初始化Save按钮
    save_button = findViewById(R.id.save_button);
    
    // 设置Save按钮点击事件
    save_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // 确保textData已经被正确赋值(比如从EditText或文件读取后)
            Intent resultIntent = new Intent();
            // 把textData放入Intent,"TEXT_DATA"是自定义的键,父Activity要用它来取数据
            resultIntent.putExtra("TEXT_DATA", textData);
            // 设置返回结果码为RESULT_OK,表示操作成功
            setResult(RESULT_OK, resultIntent);
            // 关闭当前对话框Activity
            finish();
        }
    });
}

步骤2:在MainActivity中接收返回的数据

这里分两种情况,取决于你用的是旧版API还是新版AndroidX:

方式一:旧版startActivityForResult()(适合API < 30)

首先在MainActivity里启动TextDialogActivity时要用startActivityForResult():

// 比如在MainActivity的某个按钮点击事件里启动对话框
Intent intent = new Intent(MainActivity.this, TextDialogActivity.class);
// 100是自定义的请求码,用来区分不同的Activity请求
startActivityForResult(intent, 100);

然后重写onActivityResult()方法来接收数据:

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // 匹配请求码和结果码,确保是我们要的返回数据
    if (requestCode == 100 && resultCode == RESULT_OK) {
        if (data != null) {
            // 通过之前定义的键"TEXT_DATA"取出数据
            String receivedText = data.getStringExtra("TEXT_DATA");
            // 这里可以处理接收到的数据,比如显示到TextView或者做其他逻辑
            // 示例:textView.setText(receivedText);
        }
    }
}

方式二:新版ActivityResultLauncher(AndroidX推荐)

如果你的项目用了AndroidX,更推荐这种方式,避免startActivityForResult()被废弃的问题:

// 在MainActivity里定义ActivityResultLauncher
private ActivityResultLauncher<Intent> dialogResultLauncher = registerForActivityResult(
    new ActivityResultContracts.StartActivityForResult(),
    result -> {
        // 检查结果是否成功
        if (result.getResultCode() == RESULT_OK) {
            Intent data = result.getData();
            if (data != null) {
                String receivedText = data.getStringExtra("TEXT_DATA");
                // 处理接收到的数据
            }
        }
    }
);

// 启动TextDialogActivity时调用这个launcher
Intent intent = new Intent(MainActivity.this, TextDialogActivity.class);
dialogResultLauncher.launch(intent);

这样就能完美实现点击Save按钮把数据传递回MainActivity的功能啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:54:32