Skip to content

Activity使用ViewModel

这里给出一个Activity使用ViewModel的简单例子。

  • 设计ViewModel类
  • 设计layout
  • 在Activity中将2者关联起来

定义ViewModel

新建AnimCollectVm类继承AndroidViewModel

import android.app.Application;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.MutableLiveData;

public class AnimCollectVm extends AndroidViewModel {
    // 其他对象...
    public AnimCollectVm(@NonNull Application application) {
        super(application);
    }
}

设计layout

layout文件anim_collect_act.xml。 最外层用layout标签。data标签里放一个AnimCollectVm类型的vm

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

        <variable
            name="vm"
            type="com.rustfisher.tutorial2020.animation.collection.AnimCollectVm" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <!-- 其他内容 -->
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

会自动生成AnimCollectActBinding类。

Activity中使用vm

Activity类AnimCollectAct需要继承androidx.appcompat.app.AppCompatActivity

使用DataBindingUtil.setContentView方法来获得AnimCollectActBinding的对象mBinding

使用ViewModelProviderget方法,生成对应的AnimCollectVm对象mAnimVm

然后把mAnimVm交给mBinding对象。

public class AnimCollectAct extends AppCompatActivity {
    private AnimCollectActBinding mBinding;
    private AnimCollectVm mAnimVm;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBinding = DataBindingUtil.setContentView(this, R.layout.anim_collect_act);
        mAnimVm = new ViewModelProvider(this).get(AnimCollectVm.class);
        mBinding.setVm(mAnimVm);
        // 其他代码...
    }
}

参考工程 Tutorial2020