Android中三个类通过Intent传递数据:回传变量未更新问题
解决Activity间数据回传失效的问题
嘿,我知道你遇到的问题了!你现在的核心问题是类B向类C传递数据后,没法接收C修改后的回传值——因为你用普通的startActivity启动C,这种方式只是单向打开新页面,没法把数据从C主动送回B。咱们用「带结果返回」的Activity启动机制就能解决这个问题,下面分两种方案给你说明:
方案一:使用旧版startActivityForResult(兼容低版本)
这种方式是传统的回传实现,适合还在使用非AndroidX库的项目:
1. 修改类B启动类C的代码
把原来普通的startActivity替换成带请求码的启动方式:
// 类B中启动C的代码 Intent intent = new Intent(B.this, C.class); intent.putExtra("name", Uname); // 把当前的name传给C startActivityForResult(intent, 100); // 100是自定义请求码,只要唯一就行
2. 类C中修改数据并返回给B
在C中修改完name为"Ramesh"后,通过setResult把数据回传:
// 类C中的处理逻辑 String modifiedName = "Ramesh"; Intent resultIntent = new Intent(); resultIntent.putExtra("modified_name", modifiedName); setResult(RESULT_OK, resultIntent); // 设置成功状态和回传数据 finish(); // 关闭C页面,回到B
3. 类B中重写回调接收结果
在B中重写onActivityResult方法,接收C返回的数据并更新Uname:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 匹配请求码和结果状态,确保是C返回的有效数据 if (requestCode == 100 && resultCode == RESULT_OK) { String updatedName = data.getStringExtra("modified_name"); Uname = updatedName; // 这里Uname就会被更新为"Ramesh"了 // 可以在这里更新UI或者执行其他后续逻辑 } }
方案二:使用新版Activity Result API(AndroidX推荐)
如果你的项目已经迁移到AndroidX,推荐用这种更安全、更灵活的方式,替代已废弃的startActivityForResult:
1. 类B中注册Activity Result回调
在B的类成员中注册一个回调,用于接收C返回的结果:
// 类B的成员变量 private ActivityResultLauncher<Intent> startCForResult = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK) { Intent data = result.getData(); if (data != null) { String updatedName = data.getStringExtra("modified_name"); Uname = updatedName; // 更新Uname为"Ramesh" // 处理更新后的逻辑,比如刷新UI显示新值 } } } );
2. 类B中启动类C的代码
用刚才注册的Launcher来启动C,代替普通的startActivity:
Intent intent = new Intent(B.this, C.class); intent.putExtra("name", Uname); startCForResult.launch(intent);
3. 类C的返回代码(和方案一一致)
String modifiedName = "Ramesh"; Intent resultIntent = new Intent(); resultIntent.putExtra("modified_name", modifiedName); setResult(RESULT_OK, resultIntent); finish();
为什么原来的方式不行?
你之前直接用startActivity启动C,相当于创建了一个独立的C实例,C里修改的数据只是在自己的实例里,没法主动通知B更新。只有通过「请求-返回结果」的机制,让B在回调中接收C返回的新数据,才能把B里的Uname更新为预期的"Ramesh"。
内容的提问来源于stack exchange,提问作者Adarsh Sunil
相关产品推荐
相关产品推荐

