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

如何从Activity B中的Fragment向启动它的Activity A返回数据?

解决方案:从Activity B内的Fragment传递数据到Activity A

这个场景其实挺常见的,核心就是Fragment → Activity B → Activity A的两步数据传递,咱们一步步来实现:

1. 定义Fragment与Activity B的通信接口

首先得让Fragment能把数据传递给它的宿主Activity B,最规范的方式是用接口回调:

在你的Fragment类里定义一个接口:

// 假设是Kotlin代码,Java逻辑完全类似
interface OnDataSelectedListener {
    fun onDataSelected(data: YourDataType) // 替换成你实际的数据类型,比如String、自定义对象等
}

然后在Fragment的onAttach方法里绑定这个接口(确保宿主Activity实现了该接口):

private lateinit var listener: OnDataSelectedListener

override fun onAttach(context: Context) {
    super.onAttach(context)
    try {
        listener = context as OnDataSelectedListener
    } catch (e: ClassCastException) {
        throw ClassCastException("$context must implement OnDataSelectedListener")
    }
}

当Fragment内选中数据时,调用接口方法把数据传给Activity B:

// 比如Fragment内用户选中某条数据时
fun onUserSelectData(selected: YourDataType) {
    listener.onDataSelected(selected)
}

2. 让Activity B实现接口,接收Fragment的数据

在Activity B里实现刚才定义的接口,并且把接收到的数据暂存起来(因为要等ActionBar按钮点击时再传回Activity A):

class ActivityB : AppCompatActivity(), YourFragment.OnDataSelectedListener {
    private var selectedData: YourDataType? = null

    override fun onDataSelected(data: YourDataType) {
        // 接收Fragment传来的数据,暂存到变量中
        selectedData = data
    }

    // 其他Activity B的初始化代码...
}

3. 处理Activity B的ActionBar菜单点击,返回数据给Activity A

首先在Activity B里创建ActionBar菜单:

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.your_actionbar_menu, menu) // 替换成你的菜单资源文件
    return true
}

然后处理菜单点击事件,当点击目标按钮时,把暂存的数据通过setResult返回给Activity A,最后关闭Activity B:

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return when (item.itemId) {
        R.id.action_send_back -> {
            selectedData?.let { data ->
                // 创建Intent并放入数据
                val resultIntent = Intent().apply {
                    putExtra("KEY_SELECTED_DATA", data) // 自定义键名,数据如果是对象要实现Parcelable
                }
                // 设置返回结果
                setResult(RESULT_OK, resultIntent)
            } ?: run {
                // 若用户未选中数据,可返回取消状态
                setResult(RESULT_CANCELED)
            }
            // 关闭Activity B
            finish()
            true
        }
        else -> super.onOptionsItemSelected(item)
    }
}

4. 在Activity A中接收返回的数据

根据你使用的Android版本,有两种接收方式:

方式1:传统startActivityForResult(适用于旧版API)

// 启动Activity B的代码
private val REQUEST_CODE_B = 1001
val intent = Intent(this, ActivityB::class.java)
startActivityForResult(intent, REQUEST_CODE_B)

// 接收返回结果
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REQUEST_CODE_B && resultCode == RESULT_OK) {
        val receivedData = data?.getParcelableExtra<YourDataType>("KEY_SELECTED_DATA")
        // 处理拿到的数据,比如更新UI、存储等
        receivedData?.let {
            // 你的业务逻辑
        }
    }
}

方式2:AndroidX推荐的registerForActivityResult

// 初始化ActivityResultLauncher
private val activityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == RESULT_OK) {
        val data = result.data
        val receivedData = data?.getParcelableExtra<YourDataType>("KEY_SELECTED_DATA")
        // 处理数据
        receivedData?.let {
            // 你的业务逻辑
        }
    }
}

// 启动Activity B
val intent = Intent(this, ActivityB::class.java)
activityResultLauncher.launch(intent)

额外注意事项

  • 如果传递的是自定义对象,必须让对象实现Parcelable接口(Kotlin可用@Parcelize注解简化实现)。
  • 若Activity B包含多个Fragment,建议让所有需要传递数据的Fragment都实现同一个接口,确保Activity B能统一接收数据。
  • 可以根据业务需求,在用户未选中数据时给出提示,而非直接返回取消状态。

内容的提问来源于stack exchange,提问作者mba3gar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:01:24