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

如何在从Activity返回时用Navigation组件刷新Fragment内容?

解决方案

下面提供几种可行的实现方式,根据你的项目场景选择:

方法一:使用Activity Result API(推荐,替代废弃的startActivityForResult)

这是Jetpack推荐的替代旧API的方案,能更安全地处理Activity返回结果。

  1. 在需要刷新的Fragment中注册Activity Result Launcher:
private val activityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    // 确认新Activity正常关闭并返回成功结果
    if (result.resultCode == Activity.RESULT_OK) {
        // 执行Fragment内容刷新操作
        refreshContent()
    }
}
  1. 在Fragment中打开新Activity时,使用这个Launcher启动:
private fun openTargetActivity() {
    val intent = Intent(requireContext(), TargetActivity::class.java)
    activityResultLauncher.launch(intent)
}
  1. 在新Activity中,完成操作后设置返回结果并关闭:
// 比如点击完成按钮时
fun onCompleteClick(view: View) {
    setResult(Activity.RESULT_OK)
    finish()
}
  1. 实现Fragment的刷新方法:
private fun refreshContent() {
    // 这里写你的刷新逻辑,比如重新请求接口、更新列表适配器
    viewModel.reloadData()
    binding.recyclerView.adapter?.notifyDataSetChanged()
}

方法二:使用共享ViewModel + LiveData

利用ViewModel的生命周期特性,让Fragment和新Activity共享Activity级别的ViewModel,通过LiveData通知刷新。

  1. 创建共享ViewModel(作用域为宿主Activity):
class SharedRefreshViewModel : ViewModel() {
    // 用LiveData标记是否需要刷新
    private val _needRefresh = MutableLiveData<Boolean>()
    val needRefresh = _needRefresh as LiveData<Boolean>

    // 触发刷新的方法
    fun triggerRefresh() {
        _needRefresh.value = true
    }

    // 重置刷新标记,避免重复触发
    fun resetRefreshFlag() {
        _needRefresh.value = false
    }
}
  1. 在需要刷新的Fragment中获取并观察ViewModel:
// 使用activityViewModels()获取Activity级别的ViewModel实例
private val sharedViewModel: SharedRefreshViewModel by activityViewModels()

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    
    sharedViewModel.needRefresh.observe(viewLifecycleOwner) { needRefresh ->
        if (needRefresh) {
            refreshContent()
            sharedViewModel.resetRefreshFlag()
        }
    }
}
  1. 在新Activity中获取同一个ViewModel并触发刷新:
private val sharedViewModel: SharedRefreshViewModel by viewModels({ requireActivity() })

fun onCompleteClick(view: View) {
    sharedViewModel.triggerRefresh()
    finish()
}

方法三:本地广播(适合简单场景,不推荐大规模使用)

如果不想依赖Jetpack组件,可以用本地广播实现通知:

  1. 在Fragment中注册广播接收器:
private val refreshReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        if (intent?.action == "ACTION_REFRESH_FRAGMENT") {
            refreshContent()
        }
    }
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    val filter = IntentFilter("ACTION_REFRESH_FRAGMENT")
    requireContext().registerReceiver(refreshReceiver, filter)
}

override fun onDestroyView() {
    super.onDestroyView()
    // 必须注销接收器,防止内存泄漏
    requireContext().unregisterReceiver(refreshReceiver)
}
  1. 在新Activity中发送广播:
fun onCompleteClick(view: View) {
    val intent = Intent("ACTION_REFRESH_FRAGMENT")
    sendBroadcast(intent)
    finish()
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 05:25:16