至於@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