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

Android ViewModel无法在Fragment切换时保留状态问题求助

解决Fragment间共享ViewModel数据丢失的问题

嘿,这个问题我之前踩过同款坑!核心问题就出在你获取ViewModel的作用域上,咱们一步步捋清楚:

为什么数据会丢失?

你现在用的是ViewModelProviders.of(this).get(...),这里的this指向当前Fragment对象。ViewModel的生命周期是和它的所有者绑定的——每个Fragment都会拥有自己独立的ViewModel实例。当你切换Fragment(比如用replace操作),原来的Fragment可能被销毁,对应的ViewModel也会被系统回收;新创建的Fragment又会初始化一个全新的ViewModel,自然就找不到之前存储的数据了。

正确的实现方式

要让两个Fragment共享同一个ViewModel,需要把ViewModel的所有者改成它们所属的Activity,这样ViewModel的生命周期就和Activity绑定,只要Activity没销毁,ViewModel就会一直存在,数据也能完整保留。

修改你的ViewModel获取代码:

@Override 
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 把this换成getActivity()或者requireActivity()
    interventionViewModel = ViewModelProviders.of(getActivity()).get(InterventionsViewModel.class);
    
    // 如果你用的是新版Jetpack库(更推荐),可以用ViewModelProvider的构造方法:
    // interventionViewModel = new ViewModelProvider(requireActivity()).get(InterventionsViewModel.class);
}

额外注意事项

  • 确保你的InterventionsViewModel继承自ViewModel(而非AndroidViewModel,除非你需要Application上下文):
    public class InterventionsViewModel extends ViewModel {
        // 你的LiveData定义和业务逻辑代码
    }
    
  • 如果你使用Navigation Component进行Fragment导航,还可以绑定到导航图的作用域(用getViewModelStoreOwner()),不过Activity作用域是跨Fragment共享数据最通用的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:34:04