如何在ActivityA中用registerForActivityResult替代onActivityResult实现页面回退
用registerForActivityResult替代onActivityResult实现页面回退逻辑
核心实现步骤(仅需修改ActivityA及内部FragmentA)
原有的ActivityB及内部Fragment逻辑无需改动——依然通过LiveData触发setResult(1000)后finish即可,重点调整ActivityA的结果监听方式:
- 在ActivityA中初始化ActivityResultLauncher
在ActivityA的onCreate方法(或合适的初始化时机)中,注册用于接收ActivityB返回结果的Launcher:
class ActivityA : AppCompatActivity() { // 定义Launcher,替代原有的onActivityResult private val activityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> // 判断返回的resultCode是否为约定的1000 if (result.resultCode == 1000) { // 关闭当前ActivityA,回到FragmentMain finish() } } // 提供给内部FragmentA调用的方法,用于启动ActivityB fun startActivityB() { val intent = Intent(this, ActivityB::class.java) activityResultLauncher.launch(intent) } // ... 其他原有代码 }
- 修改ActivityA_FragmentA启动ActivityB的方式
将FragmentA中原有的startActivityForResult调用,替换为调用宿主ActivityA提供的startActivityB()方法:
class ActivityA_FragmentA : Fragment() { // ... 其他原有代码 // 启动ActivityB的方法 private fun launchActivityB() { // 调用宿主ActivityA的方法启动ActivityB (activity as? ActivityA)?.startActivityB() } }
逻辑说明
这套实现完全兼容原有ActivityB的结果返回流程:ActivityB结束时设置的resultCode=1000会被ActivityA中注册的activityResultLauncher捕获,进而触发ActivityA关闭,最终回到FragmentMain。相比旧的onActivityResult,这种方式无需处理requestCode匹配,逻辑更简洁,也规避了onActivityResult被废弃的问题。
内容的提问来源于stack exchange,提问作者Yatin
相关产品推荐
相关产品推荐

