項(xiàng)目需求
在多個(gè)Activity或者Fragment中使用同一個(gè)ViewModel
需求實(shí)現(xiàn)
1.使用ActivityScope或FragmentScope
想在一個(gè)Activity或Fragment中共享ViewModel實(shí)例,可以使用ActivityScope或FragmentScope。這兩種范圍會(huì)根據(jù)它們所綁定的Activity或Fragment自動(dòng)管理ViewModel實(shí)例的生命周期。
例如,創(chuàng)建一個(gè)繼承自AndroidX庫(kù)中的ViewModel類的MyViewModel實(shí)例,并將其分配給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實(shí)例
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實(shí)例
mViewModel = new ViewModelProvider(requireActivity()).get(MyViewModel.class);
return view;
}
}
注意,在MainActivity中,使用this作為ViewModelProvider的構(gòu)造函數(shù)參數(shù),而在MyFragment中,使用requireActivity()作為參數(shù)。這是因?yàn)镕ragment需要使用其父Activity的范圍來訪問ViewModel實(shí)例。
2.使用ApplicationScope
如果想在整個(gè)應(yīng)用程序中共享ViewModel實(shí)例,可以使用ApplicationScope。這種范圍會(huì)在整個(gè)應(yīng)用程序中自動(dòng)管理ViewModel實(shí)例的生命周期。
例如,創(chuàng)建一個(gè)繼承自AndroidX庫(kù)中的ViewModel類的MyViewModel實(shí)例,并將其分配給整個(gè)應(yīng)用程序:
public class MyApplication extends Application {
private MyViewModel mViewModel;
@Override
public void onCreate() {
super.onCreate();
// 獲取ViewModel實(shí)例
mViewModel = new ViewModelProvider.AndroidViewModelFactory(this).create(MyViewModel.class);
}
public MyViewModel getViewModel() {
return mViewModel;
}
}
注意,在MyApplication中,我們使用了ViewModelProvider.AndroidViewModelFactory這個(gè)工廠來創(chuàng)建ViewModel實(shí)例。這個(gè)工廠需要一個(gè)Application對(duì)象作為構(gòu)造函數(shù)參數(shù)。
然后可以在任何Activity或Fragment中,通過MyApplication實(shí)例獲取ViewModel實(shí)例:
public class MainActivity extends AppCompatActivity {
private MyViewModel mViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 獲取ViewModel實(shí)例
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實(shí)例
MyApplication app = (MyApplication) requireActivity().getApplication();
mViewModel = app.getViewModel();
return view;
}
}
注意,在MainActivity和MyFragment中,我們都使用了getApplication()方法來獲取MyApplication實(shí)例,并從MyApplication實(shí)例中獲取ViewModel實(shí)例。文章來源:http://www.zghlxwxcb.cn/news/detail-551232.html
總之,可以根據(jù)自己的需求選擇合適的方法來共享ViewModel實(shí)例。文章來源地址http://www.zghlxwxcb.cn/news/detail-551232.html
到了這里,關(guān)于【Android】怎么使用一個(gè)ViewModel用在多個(gè)Activity或者Fragment中的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!