项目需求
在多个Activity或者Fragment中使用同一个ViewModel
需求实现
1.使用ActivityScope或FragmentScope
想在一个Activity或Fragment中共享ViewModel实例,可以使用ActivityScope或FragmentScope。这两种范围会根据它们所绑定的Activity或Fragment自动管理ViewModel实例的生命周期。
例如,创建一个继承自AndroidX库中的ViewModel类的MyViewModel实例,并将其分配给MainActivity和MyFragment:
public class MainActivity extends AppCompatActivity { private MyViewModel mViewModel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取ViewModel实例 mViewModel = new ViewModelProvider(this).get(MyViewModel.class); }}public class MyFragment extends Fragment { private MyViewModel mViewModel; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_my, container, false); // 获取ViewModel实例 mViewModel = new ViewModelProvider(requireActivity()).get(MyViewModel.class); return view; }}
注意,在MainActivity中,使用this作为ViewModelProvider的构造函数参数,而在MyFragment中,使用requireActivity()作为参数。这是因为Fragment需要使用其父Activity的范围来访问ViewModel实例。
2.使用ApplicationScope
如果想在整个应用程序中共享ViewModel实例,可以使用ApplicationScope。这种范围会在整个应用程序中自动管理ViewModel实例的生命周期。
例如,创建一个继承自AndroidX库中的ViewModel类的MyViewModel实例,并将其分配给整个应用程序:
public class MyApplication extends Application { private MyViewModel mViewModel; @Override public void onCreate() { super.onCreate(); // 获取ViewModel实例 mViewModel = new ViewModelProvider.AndroidViewModelFactory(this).create(MyViewModel.class); } public MyViewModel getViewModel() { return mViewModel; }}
注意,在MyApplication中,我们使用了ViewModelProvider.AndroidViewModelFactory这个工厂来创建ViewModel实例。这个工厂需要一个Application对象作为构造函数参数。
然后可以在任何Activity或Fragment中,通过MyApplication实例获取ViewModel实例:
public class MainActivity extends AppCompatActivity { private MyViewModel mViewModel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取ViewModel实例 MyApplication app = (MyApplication) getApplication(); mViewModel = app.getViewModel(); }}public class MyFragment extends Fragment { private MyViewModel mViewModel; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_my, container, false); // 获取ViewModel实例 MyApplication app = (MyApplication) requireActivity().getApplication(); mViewModel = app.getViewModel(); return view; }}
注意,在MainActivity和MyFragment中,我们都使用了getApplication()方法来获取MyApplication实例,并从MyApplication实例中获取ViewModel实例。
总之,可以根据自己的需求选择合适的方法来共享ViewModel实例。
来源地址:https://blog.csdn.net/qq_43358469/article/details/130361027