You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 14:27:00