至于@CommonsWare提到的viewmodel
里的fragment
里面的实例应该和Activity
一样。
因此,活动里面,你应该做这样的事情
MyViewModel vm = ViewModelProviders.of(this).get(MyViewModel.class);
的片段里,你应该做这样的事情
MyViewModel vm = ViewModelProviders.of(getActivity()).get(MyViewModel.class);
在结果,他们会用同一个实例。
但是,如果您尝试使用它的片段里面
MyViewModel vm = ViewModelProviders.of(this).get(MyViewModel.class);
视图模型将在该片段中,当你旋转设备重建。 由于实例保存在片段内部而不是活动,当重新创建活动时,片段也将被重新创建,并且MyViewModel实例也会被重新创建。
尝试采取的例子来看看在主详细片段(这可能很容易解决您的问题)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上做了简单的主从模板
SimpleDetailActivity.java
SimpleDetailFragment.java
“片段实例本身不是CH老化“ - 这是什么意思?一个'ViewModel'被实现为你传入'ViewModelProviders.of()'的任何'FragmentActivity'或'Fragment'的子保留片段。 – CommonsWare
在活动我有一个片段阵列和我只是片段之间交换所述阵列中(使用底部NAV): '片段= mapOf(id来片段等)' 再后来: ' supportFragmentManager.beginTransaction()。replace(R.id.fragmentContainer,fragment).commit()' 我可以看到片段引用是相同的(未被重新创建)。 – Luke
如果我移动到活动范围,它可以正常工作。 'viewModel = ViewModelProviders.of(activity).get(DashboardViewModel :: class.java)' – Luke