ReactNative场景下Activity重写onActivityResult时Fragment如何使用ActivityResult API
问题根因
回调无法触发的核心原因是默认的ReactActivity重写onActivityResult方法时,未调用父类ComponentActivity的同名方法。新版ActivityResult API的事件分发逻辑完全依赖ComponentActivity.onActivityResult中内置的ActivityResultRegistry事件分发、Fragment事件透传逻辑,缺少这一步调用就会导致Fragment中注册的回调无法收到事件。
方案1:修改基类onActivityResult实现(最推荐)
仅需要在你的ReactActivity子类的onActivityResult中补充super调用即可,不需要额外编写Fragment分发逻辑:
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { // 触发系统原生事件分发逻辑 super.onActivityResult(requestCode, resultCode, data); mDelegate.onActivityResult(requestCode, resultCode, data); }
Kotlin版本实现:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) mDelegate.onActivityResult(requestCode, resultCode, data) }
修改后系统会自动将事件透传给所有注册了ActivityResult回调的Fragment,你之前在Activity中手动查找Fragment调用onActivityResult的代码可以完全删除。
方案2:手动绑定Activity的ResultRegistry(无法修改基类时使用)
如果项目约束不允许修改基类ReactActivity的实现,可以直接在Fragment中绑定宿主Activity的ActivityResultRegistry注册回调,同样不需要在Activity中编写额外逻辑:
// Fragment中注册回调,绑定Fragment视图生命周期避免内存泄漏 private val resultLauncher = requireActivity().activityResultRegistry.register( "unique_request_key", ActivityResultContracts.StartActivityForResult(), viewLifecycleOwner ) { activityResult -> // 此处正常接收回调 val code = activityResult.resultCode val data = activityResult.data } // 启动Activity逻辑不变 resultLauncher.launch(yourIntent)
内容的提问来源于stack exchange,提问作者iamanbansal
相关产品推荐
相关产品推荐

