如何从另一个Activity获取文本后更新主界面的TextView?
解决从弹窗Activity更新主界面TextView的问题
问题根源
你在TargetPopupActivity里直接调用MainActivity的方法更新文本,本质是创建了一个全新的MainActivity实例,和当前显示的主界面实例不是同一个,所以setText()不会作用到正在显示的界面上。
推荐方案:使用Activity Result API(AndroidX官方推荐)
这是替代已废弃的startActivityForResult()的新方案,步骤如下:
- 在MainActivity中注册Activity Result Launcher
// Kotlin示例 private val popupResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { val inputText = result.data?.getStringExtra("POPUP_INPUT") // 直接更新主界面的targetButton targetButton.text = inputText ?: "" } }
- 启动TargetPopupActivity时使用这个Launcher
// 比如主界面打开弹窗的触发代码 targetButton.setOnClickListener { val intent = Intent(this, TargetPopupActivity::class.java) popupResultLauncher.launch(intent) }
- 在TargetPopupActivity中返回输入内容
// 弹窗内确认按钮的点击事件 confirmBtn.setOnClickListener { val inputContent = targetBox.text.toString().trim() val resultIntent = Intent().apply { putExtra("POPUP_INPUT", inputContent) } setResult(Activity.RESULT_OK, resultIntent) finish() // 关闭弹窗Activity }
兼容方案:使用onActivityResult(旧版,已废弃但仍可运行)
如果项目还没迁移到Activity Result API,可使用此方案:
- MainActivity中启动弹窗并传入请求码
// Java示例 targetButton.setOnClickListener(v -> { Intent intent = new Intent(MainActivity.this, TargetPopupActivity.class); startActivityForResult(intent, 1001); // 1001为自定义请求码,可自行修改 });
- 重写MainActivity的onActivityResult方法处理返回数据
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1001 && resultCode == RESULT_OK) { if (data != null) { String inputText = data.getStringExtra("POPUP_INPUT"); targetButton.setText(inputText); } } }
- TargetPopupActivity中返回数据
confirmBtn.setOnClickListener(v -> { String inputContent = targetBox.getText().toString().trim(); Intent resultIntent = new Intent(); resultIntent.putExtra("POPUP_INPUT", inputContent); setResult(RESULT_OK, resultIntent); finish(); });
关键注意事项
- 绝对不要通过
new MainActivity()的方式创建实例并调用方法,每个Activity实例对应独立的界面上下文,新实例无法操作当前显示的界面。 - 若
TargetPopupActivity设置了弹窗样式(比如主题为Theme.AppCompat.Dialog),上述方案同样适用,核心是通过Intent完成两个Activity之间的数据传递。
内容的提问来源于stack exchange,提问作者Jackson Xailer
相关产品推荐
相关产品推荐

