gpt4 book ai didi

android - 支持 fragment 管理器 .replace() 和 ViewModel

转载 作者:行者123 更新时间:2023-11-29 15:38:31 28 4
gpt4 key购买 nike

看来,无论何时您在支持 fragment 管理器的事务中使用 .replace() 方法,都会重新创建 ViewModel。这是故意的吗? Fragment 实例本身没有变化,并且 ViewModel 将在旋转/配置更改期间(部分)保留。

我看到了以下场景:

  1. 获取 View 模型引用(计数 = 0)、更新计数 = 1、旋转、计数 = 1、onCreate 调用再次并且计数 = 0(重新创建 View 模型)。
  2. 调用 .replace() 并重新创建 View 模型( Activity 和 fragment 实例不变)。

使用支持库 26.0.0。

ViewModel 正在我的 fragment 的 onCreate 中创建,并且作用域为 Fragment:

viewModel = ViewModelProviders.of(this).get(DashboardViewModel::class.java)

有人能解释一下这是否正常吗?

最佳答案

正如@CommonsWare 提到的,fragment 中的viewmodel 实例在Activity 中应该是相同的。

因此,在 Activity 中,你应该做这样的事情

MyViewModel vm = ViewModelProviders.of(this).get(MyViewModel.class);

在 Fragment 中,你应该做这样的事情

MyViewModel vm = ViewModelProviders.of(getActivity()).get(MyViewModel.class);

结果,他们将使用相同的实例。

但是,如果您尝试在 fragment 内部使用它

MyViewModel vm = ViewModelProviders.of(this).get(MyViewModel.class);

当您旋转设备时,Viewmodel 将在 fragment 中重新创建。 由于实例保存在 fragment 而不是 Activity 中,当 Activity 重新创建时, fragment 也将被重新创建,以及 MyViewModel 实例。

尝试看一下master detail fragment的例子(这可能很容易解决你的问题)ViewModel in Android Developer

public class MasterFragment extends Fragment {
private SharedViewModel model;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
itemSelector.setOnClickListener(item -> {
model.select(item);
});
}
}

public class DetailFragment extends LifecycleFragment {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
model.getSelected().observe(this, { item ->
// update UI
});
}
}

我在github上也做了简单的Master Detail模板

SimpleDetailActivity.java

SimpleDetailFragment.java

关于android - 支持 fragment 管理器 .replace() 和 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45403136/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com