当前位置:   article > 正文

Android jetpack 之 ViewModel_android jetpack viewmodel java

android jetpack viewmodel java

首先,ViewModel是什么.
ViewModel是一个以注重生命周期存储和管理界面相关数据的类。ViewModel可以让数据在发生如屏幕旋转等配置更改后继续存留。
比如我现在在Activity里定义了一个Int型的变量x初始化为0。在Activity运行期间,我点击了一个按钮让x的值变为1。假如此时我旋转,等屏幕旋转后,Activity重建。那x的值会被重新设置为0。现在我们使用ViewModel,让x的值在屏幕旋转之后还是1。

开始使用ViewModel
实现一个ViewModel我们可以创建一个类来继承ViewModel类,并在里面定义一个Int型的变量,初始化为0.

  1. class NumViewModel : ViewModel() {
  2. var num: Int = 0
  3. }

接着在Activity的onCreate()方法中获取我们的NumViewModel (在依赖了Android KTX 中的 Fragment KTX模块后,可以直接使用viewModels和activityViewModels属性委托绑定到ViewModel

  1. override fun onCreate(savedInstanceState: Bundle?) {
  2. super.onCreate(savedInstanceState)
  3. setContentView(R.layout.activity_main)
  4. val model = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory())
  5. .get(NumViewModel::class.java)
  6. }

现在我点击一个按钮让NumViewModel中的x的值变为1。假如此时旋转屏幕,在Activity重建后,NumViewModel中x的值还是为1。

使用ViewModel在Fragment之间共享数据
我们可以使用ViewModel在Fragment之间共享数据,只要我们的Fragment获取ViewModel时是使用的是包含他们的Activity,这里使用的是requireActivity()方法,他返回一个不为空的Activity。此时他们获取的是同一个SharedViewmodel的实例

  1. class SharedViewModel : ViewModel() {
  2. val selected = MutableLiveData<String>()
  3. fun select(string: String) {
  4. selected.value = string
  5. }
  6. }
  7. class OneFragment : Fragment(){
  8. private lateinit var sharedViewModel: SharedViewModel
  9. override fun onCreate(savedInstanceState: Bundle?) {
  10. super.onCreate(savedInstanceState)
  11. sharedViewModel = ViewModelProvider(requireActivity(),
  12. ViewModelProvider.NewInstanceFactory()).get(SharedViewModel::class.java)
  13. }
  14. }
  15. class TwoFragment : Fragment(){
  16. private lateinit var sharedViewModel: SharedViewModel
  17. override fun onCreate(savedInstanceState: Bundle?) {
  18. super.onCreate(savedInstanceState)
  19. sharedViewModel = ViewModelProvider(requireActivity(),
  20. ViewModelProvider.NewInstanceFactory()).get(SharedViewModel::class.java)
  21. }
  22. }

ViewModel对象的获取
我们在创建ViewModel对象的时候使用了ViewModelProvider下面是它的构造方法:

public ViewModelProvider(@NonNull ViewModelStoreOwner owner, @NonNull Factory factory) {
    
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/627537
推荐阅读
相关标签
  

闽ICP备14008679号