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

使用Navigation方向跳转fragment时如何保留原fragment的数据?

解决方案

方案1:将Fragment2配置为对话框目的地(优先推荐,完全匹配弹窗需求)

该方案下跳转Fragment2时不会销毁Fragment1的视图,返回时所有状态完全保留,无需额外做数据保存逻辑。

  • 修改Fragment2的继承父类为DialogFragment,替代原有普通Fragment
  • 修改导航图配置,将Fragment2的目的地标签从<fragment>改为<dialog>:
<dialog
    android:id="@+id/fragment2"
    android:name="你的包名.Fragment2"
    android:label="Fragment2" />
  • 原有跳转逻辑无需修改,直接使用现有代码即可生效。

方案2:保留普通Fragment目的地的修复方法

如果不需要弹窗样式,仍使用普通Fragment跳转,按以下步骤修改:

修正ViewModel作用域

不要使用Fragment自身作用域的ViewModel,改为使用宿主Activity作用域,确保ViewModel不会随Fragment1的视图销毁而重置:

// Fragment1中获取ViewModel的代码
val viewModel by activityViewModels<你的ViewModel类>()

避免重复请求数据

在ViewModel中增加加载标记,仅首次进入页面时触发数据拉取:

class 你的ViewModel类 : ViewModel() {
    private var hasLoaded = false
    val 列表数据 = MutableLiveData<List<你的数据类型>>()

    fun 拉取数据方法() {
        if (hasLoaded) return
        viewModelScope.launch {
            // 原有数据请求逻辑
            列表数据.postValue(请求结果)
            hasLoaded = true
        }
    }
}

可选:保存RecyclerView滚动状态

如果需要保留列表滚动位置,增加以下逻辑:

private var 列表状态: Parcelable? = null

override fun onDestroyView() {
    super.onDestroyView()
    列表状态 = recyclerView.layoutManager?.onSaveInstanceState()
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    // 原有初始化逻辑
    viewModel.列表数据.observe(viewLifecycleOwner) { data ->
        adapter.submitList(data)
        列表状态?.let {
            recyclerView.layoutManager?.onRestoreInstanceState(it)
            列表状态 = null
        }
    }
    viewModel.拉取数据方法()
}

内容的提问来源于stack exchange,提问作者An Dương

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:54:02