
1. 模块级别的 build.gradle 需要加入 mvvm 的 gradle
2. 需要创建一个 Java类, 作为 ViewModel, 这个类的要求是 需要继承 androidx.lifecycle.ViewModel
3. 修改布局文件 activity_main.xml 将其修改成为mvvm的结构
4. 在 MainActivity 当中, 初始化 MVVM 模式的代码
代码
buildFeatures {
viewBinding true
}
dataBinding {
enabled true
}
说明
1、位置说明:
存在于 app 模块级别的 gradle 里面,需要放在 android{ … } 当中
2、原因说明:
只有引入了当前的内容,后续的 MainActivity 当中才能自动创建具体的 Binding 类型
代码
import android.util.Log;
import androidx.lifecycle.ViewModel;
public class DemoViewModel extends ViewModel {
private static final String TAG = DemoViewModel.class.getSimpleName();
// 增加了一个方法, 用于 布局当中的事件处理方案
// 在布局当中采用属性, 绑定事件 android:onClick = "@{()->viewModel.show()}"
public void show() {
Log.i(TAG, "Hello This is My First Activity type MVVM");
}
}
说明
1、注意问题:
这里的 ViewModel 需要继承的是 androidx.lifecycle.ViewModel 这个类
2、方法说明:
这里的 show( ) 方法是后期为了给 控件 TextView 增加的点击事件处理。
代码
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<import type="svip.chc.DemoViewModel" />
<variable
name="viewModel"
type="DemoViewModel" />
data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{()->viewModel.show()}"
android:text="Hello World!"
android:textSize="60sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
androidx.constraintlayout.widget.ConstraintLayout>
layout>
说明
1、结构说明
<根布局> 根布局>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
2、事件处理
对于事件处理的方式存在多种写法,这里不做一一列举。
目前采用的写法格式是
android:onclick="@{()->viewModel.show()}" 在事件处理当中的
viewModel是上面标签当中定义的 name 属性值
代码
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;
import android.os.Bundle;
import svip.chc.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
// 这里的 ViewModel 是一个 Java 类的对象名称, 需要在 onCreate() 等方法当中, 进行初始化
private DemoViewModel viewModel;
// 这里的 ActivityMainBinding 是一个自动生成的类对象, 他是我们在 gradle 当中, 配置 android{...} 内部两个标签后生成的
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 如果采用的是 MVVM 的方式, 就不要直接采用下面的方式去设置布局了。
// setContentView(R.layout.activity_main);
// ------------------------------
// 我们需要给上面的两个成员变量进行初始化, 在初始化的过程中, 设置布局方式和事件监听
// 1. 初始化 binding 对象
binding = ActivityMainBinding.inflate(getLayoutInflater());
// 2. 设置布局的方式
setContentView(binding.getRoot());
// 3. 初始化 viewModel 对象
viewModel = new ViewModelProvider(this).get(DemoViewModel.class);
// 4. 通过 binding 对象, 绑定 ViewModel
binding.setViewModel(viewModel);
// 5. 设置生命周期的所有者, 让事件监听能够生效
binding.setLifecycleOwner(this);
}
}
说明
1、布局整改
将原始的设置布局的方式,需要修改成为
setContentView(binding.getRoot());2、对于成员变量需要定义两个
他们分别是
binding和viewModel 两个成员变量都要完成初始化的过程,以及初始化完毕之后的,绑定过程。
3、需要注意的两件事情:
第一件事情:
binding的类型是自动生成的,他是在我们app的gralde当中添加两段代码之后,才能自动生成 第二讲事情: 如果没有设置生命周期的所有者,点击事件的监听会失效

