正如@CommonsWare 提到的,viewmodel
里面的实例fragment
应该在Activity
.
因此,在 Activity 里面,你应该做这样的事情
MyViewModel vm = ViewModelProviders.of(this).get(MyViewModel.class);
在 Fragment 里面,你应该做这样的事情
MyViewModel vm = ViewModelProviders.of(getActivity()).get(MyViewModel.class);
结果,他们将使用相同的实例。
但是,如果您尝试在片段中使用它
MyViewModel vm = ViewModelProviders.of(this).get(MyViewModel.class);
当您旋转设备时,Viewmodel 将在片段中重新创建。由于实例保存在片段而不是活动中,因此当重新创建活动时,片段也将被重新创建,并且 MyViewModel 实例。
尝试查看有关主详细信息片段的示例(这可能很容易解决您的问题)Android Developer 中的 ViewModel
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