Kotlin中能否从Activity1的Fragment跳转到Activity2并回传选中数据?
实现方案
这个流程完全可以实现,以下是基于Kotlin的两种主流实现方案,可根据项目适配情况选择:
方案一:官方推荐 Activity Result API(AndroidX 1.2.0 及以上版本支持,优先使用)
步骤1:在Fragment1中注册返回结果接收器
将以下代码作为类成员定义在Fragment1内:
private val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { // 取出Activity2回传的数据,根据实际数据类型修改取值方法 val selectedData = result.data?.getStringExtra("SELECTED_DATA_KEY") selectedData?.let { // 此处编写拿到数据后的业务逻辑,比如更新UI } } }
步骤2:Fragment1触发跳转打开Activity2
在跳转触发逻辑(比如按钮点击回调)中添加如下代码:
val intent = Intent(requireActivity(), Activity2::class.java) // 如果需要给Activity2传前置参数,也可以在这里给intent putExtra startForResult.launch(intent)
步骤3:Activity2点击Select按钮回传数据
在Activity2的「Select」按钮点击回调中添加如下代码:
binding.btnSelect.setOnClickListener { // selectedContent替换为用户实际选中的条目数据 val selectedContent = "用户选中的条目内容" val resultIntent = Intent().apply { putExtra("SELECTED_DATA_KEY", selectedContent) // 如果需要传递复杂对象,让对象实现Parcelable接口后调用putParcelableExtra即可 } setResult(Activity.RESULT_OK, resultIntent) finish() // 关闭Activity2返回上一级 }
方案二:onActivityResult 兼容方案(仅老项目适配使用,该方法已被官方废弃)
步骤1:Fragment1重写onActivityResult接收回传数据
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) // 1001为自定义请求码,保证和跳转时的请求码一致即可 if (requestCode == 1001 && resultCode == Activity.RESULT_OK) { val selectedData = data?.getStringExtra("SELECTED_DATA_KEY") selectedData?.let { // 处理业务逻辑 } } }
步骤2:Fragment1触发跳转
val intent = Intent(requireActivity(), Activity2::class.java) startActivityForResult(intent, 1001)
步骤3:Activity2回传逻辑和方案一完全一致
注意事项
- 两端存取数据使用的key需要完全一致,避免出现拿不到数据的问题
- 传递复杂对象优先实现
Parcelable接口,性能远高于Serializable - 禁止使用全局变量存储回传数据,容易引发内存泄漏,也不符合Android组件通信规范
- 存在多个不同的回传场景时,给每个场景单独定义不同的Result launcher或请求码即可
内容的提问来源于stack exchange,提问作者마카롱
相关产品推荐
相关产品推荐

