在已分离的 fragment 中无法直接访问 ViewModels,因为 detach() 方法不会销毁 fragment,只是将其与 activity 分离。因此我们需要使用一个技巧来解决这个问题。
首先,在 fragment 中创建一个新的 ViewModelProvider。然后,使用 getActivity() 方法获取 activity,再使用它的 ViewModelProvider 获取 ViewModel。最后,在 fragment 中使用 ViewModelProvider 将其与新的 ViewModel 关联起来,使其与 activity 中的相同。
例如,在已分离的 fragment 中访问与 activity 相关联的 ViewModel 的代码如下:
public class MyFragment extends Fragment {
private MyViewModel mMyViewModel;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Create a new ViewModelProvider
ViewModelProvider viewModelProvider = new ViewModelProvider(getActivity());
// Get the ViewModel from the activity's ViewModelProvider
mMyViewModel = viewModelProvider.get(MyViewModel.class);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.my_fragment, container, false);
// Connect the ViewModel to the new fragment
viewModelProvider(getActivity()).get(MyViewModel.class).addFragment(this);
// Use the ViewModel as needed...
return view;
}
@Override
public void onDestroy() {
// Disconnect the ViewModel from the fragment
viewModelProvider(getActivity()).get(MyViewModel.class).removeFragment(this);
super.onDestroy();
}
}
这样,在已分离的 fragment 中就可以访问与 activity 相关联的 ViewModel 了。