【Android】怎么使用一个ViewModel用在多个Activity或者Fragment中

您所在的位置:网站首页 科二怎样领线 【Android】怎么使用一个ViewModel用在多个Activity或者Fragment中

【Android】怎么使用一个ViewModel用在多个Activity或者Fragment中

2023-08-18 08:24| 来源: 网络整理| 查看: 265

项目需求

在多个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实例。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3