MyViewModel myViewModel = new ViewModelProvider(this).get(MyViewModel.class);
无法实现ViewModel数据共享,有其他方法么
感谢您的回答
您的每一个用心回答,都会让这个世界变得更美好一些!
Activity 中的两个或更多 Fragment 需要相互通信是一种很常见的现象.
可以使用 ViewModel 对象解决这一常见的难点。这两个 fragment 可以使用其 activity 范围共享 ViewModel 来处理此类通信,如以下示例代码所示:
public class SharedViewModel extends ViewModel {
private final MutableLiveData<Item> selected = new MutableLiveData<Item>();
public void select(Item item) {
selected.setValue(item);
}
public LiveData<Item> getSelected() {
return selected;
}
}
public class ListFragment extends Fragment {
private SharedViewModel model;
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
itemSelector.setOnClickListener(item -> {
model.select(item);
});
}
}
public class DetailFragment extends Fragment {
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
SharedViewModel model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
model.getSelected().observe(getViewLifecycleOwner(), item -> {
// Update the UI.
});
}
}
请注意,这两个 Fragment 都会检索包含它们的 Activity。这样,当这两个 Fragment 各自获取 ViewModelProvider 时,它们会收到相同的 SharedViewModel 实例(其范围限定为该 Activity)。
此方法具有以下优势:
Activity 不需要执行任何操作,也不需要对此通信有任何了解。
除了 SharedViewModel 约定之外,Fragment 不需要相互了解。如果其中一个 Fragment 消失,另一个 Fragment 将继续照常工作。
每个 Fragment 都有自己的生命周期,而不受另一个 Fragment 的生命周期的影响。如果一个 Fragment 替换另一个 Fragment,界面将继续工作而没有任何问题。
Activity 中的两个或更多 Fragment 需要相互通信是一种很常见的现象.
可以使用
ViewModel
对象解决这一常见的难点。这两个 fragment 可以使用其 activity 范围共享ViewModel
来处理此类通信,如以下示例代码所示:请注意,这两个 Fragment 都会检索包含它们的 Activity。这样,当这两个 Fragment 各自获取
ViewModelProvider
时,它们会收到相同的SharedViewModel
实例(其范围限定为该 Activity)。此方法具有以下优势:
SharedViewModel
约定之外,Fragment 不需要相互了解。如果其中一个 Fragment 消失,另一个 Fragment 将继续照常工作。ViewModel 概览 | Android 开发者 | Android Developers (google.cn)
ViewModel数据共享是因为它的owner一样呀。
因为owner所以拿到的是同一个ViewModel
你说这个过时了,点进去看看呀,文档会有说明的,用什么替代。