如何关闭作为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
相关产品推荐
相关产品推荐

