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

Android:Activity销毁前传值至Fragment,返回时更新列表的实现方案

简易实现方案:从Activity B向Fragment A传递修改后的Object X

我来给你几个实用且简易的实现方式,完全满足你的需求——不用存储本地数据,也不用重新请求接口,直接把修改后的Object X传递回Fragment A更新列表:

方案一:使用Jetpack的registerForActivityResult(推荐,代码更简洁)

这是Google现在推荐的替代旧版startActivityForResult的方案,直接在Fragment A内部处理结果回调,不需要依赖Activity A做中间转发。

步骤1:在Fragment A中注册结果回调

首先,在Fragment A里定义一个Activity结果启动器,用来接收Activity B返回的数据:

// FragmentA.kt
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity

private val launchActivityB = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    // 确认返回结果正常
    if (result.resultCode == AppCompatActivity.RESULT_OK) {
        result.data?.let { intent ->
            // 取出修改后的Object X(注意你的对象需要实现Parcelable/Serializable)
            val modifiedX = intent.getParcelableExtra<YourObjectX>("KEY_MODIFIED_X")
            modifiedX?.let {
                // 调用你自己的方法更新Fragment A的数据列表
                updateDataList(it)
            }
        }
    }
}

步骤2:在Fragment A中启动Activity B

用上面定义的启动器来启动Activity B,还可以顺便把原始的Object X传过去给Activity B修改:

// FragmentA.kt中启动Activity B的代码
val intent = Intent(requireContext(), ActivityB::class.java)
// 如果需要传递原始X给Activity B,添加这一行
intent.putExtra("KEY_ORIGINAL_X", originalX)
launchActivityB.launch(intent)

步骤3:在Activity B中返回修改后的Object X

当用户完成修改(包括按下返回键时),把修改后的Object X打包进Intent,设置返回结果后关闭Activity:

// ActivityB.kt
// 1. 处理返回键逻辑(Android 10+推荐用onBackPressedDispatcher)
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // 注册返回键回调
    onBackPressedDispatcher.addCallback(this) {
        sendModifiedXBack()
    }
}

// 2. 封装返回数据的方法
private fun sendModifiedXBack() {
    val resultIntent = Intent()
    // 把修改后的Object X放入Intent
    resultIntent.putExtra("KEY_MODIFIED_X", modifiedX)
    // 设置成功返回的结果码
    setResult(AppCompatActivity.RESULT_OK, resultIntent)
    finish()
}

// 如果是通过按钮点击返回,直接调用sendModifiedXBack()即可

方案二:接口回调(兼容旧项目,无需Jetpack)

如果你的项目还在使用旧版的API,或者不想引入Jetpack组件,可以用接口回调的方式,让Activity A作为中间层传递数据。

步骤1:定义回调接口

创建一个接口,用来通知Fragment A数据已更新:

interface OnXModifiedListener {
    fun onXModified(modifiedX: YourObjectX)
}

步骤2:让Activity A实现这个接口

在Fragment A所属的Activity A中实现接口,负责把数据传递给Fragment A:

class ActivityA : AppCompatActivity(), OnXModifiedListener {
    override fun onXModified(modifiedX: YourObjectX) {
        // 找到Fragment A实例,调用更新方法
        val fragmentA = supportFragmentManager.findFragmentById(R.id.your_fragment_container_id) as? FragmentA
        fragmentA?.updateDataList(modifiedX)
    }
}

步骤3:在Activity B中触发回调

当需要返回时,获取Activity A的接口实例并触发回调:

// ActivityB.kt中返回时的逻辑
override fun onBackPressed() {
    // 检查父Activity是否实现了回调接口
    (parent as? OnXModifiedListener)?.let { listener ->
        listener.onXModified(modifiedX)
    }
    super.onBackPressed()
}

关键注意点:Object X的序列化

不管用哪种方案,你自定义的YourObjectX必须实现Parcelable(推荐,效率更高)或者Serializable接口,这样才能通过Intent传递。

以Parcelable为例,用Kotlin的@Parcelize注解可以快速实现:

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class YourObjectX(val id: Int, val content: String) : Parcelable

(注意需要在模块的build.gradle中添加kotlin-parcelize插件:id 'kotlin-parcelize')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:59:51