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

AndroidViewModel在Fragment切换时无法保留状态问题咨询

问题

原本认为只要Fragment隶属于同一个Activity,ViewModel就应该在Fragment切换时保留状态与数据,但实际情况并非如此。

我的ViewModel代码如下:

public class MainViewModel extends AndroidViewModel {

    public MainViewModel(@NonNull Application application) {
        super(application);

        Log.d("MainViewModel","constructor called");
    }
}

在Fragment中获取ViewModel的代码:

MainViewModel viewModel = new ViewModelProvider(this).get(MainViewModel.class);

我发现每次请求ViewModel时都会调用构造方法。我以为ViewModel的作用是一直存活,可用于在Fragment间保留状态。请问我是否用法有误?我的预期是否错误?该如何在Fragment间保留状态?

解答

你的预期是对的,ViewModel确实可以在同属一个Activity的Fragment间共享状态,但你的用法存在错误。

问题核心在于获取ViewModel时传入的生命周期所有者:你用this(当前Fragment实例)作为参数,这会让ViewModel绑定到单个Fragment的生命周期,当Fragment销毁重建时,ViewModel也会随之重建,所以每次切换Fragment都会触发构造方法调用。

要实现Fragment间的状态共享,你需要将ViewModel绑定到它们所属的Activity的生命周期,获取ViewModel时传入Activity实例即可:

// 在Fragment中获取绑定到Activity的ViewModel
MainViewModel viewModel = new ViewModelProvider(requireActivity()).get(MainViewModel.class);

这样ViewModel会跟随Activity的生命周期存活,只要Activity未被销毁,同属该Activity的所有Fragment获取到的都是同一个ViewModel实例,就能在Fragment切换时保留状态与数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 19:47:03