本文仅作为学习笔记,记录最基础的用法。
AndroidX已经默认集成jeckpack,无需添加额外依赖。
如果你还没有使用AndroidX,强烈建议早日入坑。
开启dataBing:
android {
...
dataBinding {
enabled = true
}
}
什么是ViewModel?
简单来说,ViewModel 主要用来 管理数据集 ,可以极大地简化 Activty 的工作量。
一般来说,ViewModel 命名与 对应的Actvity 保持一致。
eg. MainActivity ==>MainViewModel
建立 ViewModel 也是很简单。只要 extends ViewModel 就可以了。
public class MainViewModel extends ViewModel {
...
}
如果,在 ViewModel 中,需要使用到 Context ,就需要 extends AndroidViewModel ,并添加构造方法。
public class MainViewModel extends AndroidViewModel {
public MainViewModel(@NonNull Application application) {
super(application);
}
}
数据集 其实说白了,就是指的变量嘛。这里的数据分为两种,有感应的,无感应的。
private String aa = "";
// 这么写是可以的,但是不推荐
private LiveData<String> aa;
// 推荐使用其子类 MutableLiveData
private MutableLiveData<String> aa;
添加了数据集之后需要将其暴露出去,因为不暴露出去,无法在其它地方引用。
需要注意的是,LiveData 类型的数据,只可以使用getValue ,setValue 尽情取值赋值,不可以直接用 = 进行属性操作。
public MutableLiveData<String> getA() {
if (a == null) {
a = new MutableLiveData<>();
a.setValue("0");
}
return a;
}
需要注意的是,方法必须为public。
public void plusOne() {
aa.setValue(Integer.parseInt(aa.getValue()) + 1 + "");
}
把布局文件转换成data binding layout。简单说,就是加一层layout父标签,加一个data兄弟标签。
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<data>
data>
... 你真正的 布局文件内容 ...
layout>
手动转当然也可以,只不过Android Studio 也已经帮助我们提供了自动转换的功能,把鼠标放到布局的根标签,就会有自动提示的转换选项。
仅在data 标签下,增加 variable 标签即可。 其中 name 属性随便起名即可,type 需要指定为对应 ViewModel 的全类名。
<data>
<variable
name="vm"
type="top.vchao.jackpackdemo.MainViewModel" />
data>
name属性指定之后,编译器编译后会自动生成setXXX()方法,XXX 即为 name属性值。
这里只记录最简单的用法。
属性:
android:text="@{vm.aa}"
方法:
android:onClick="@{()->vm.plusOne()}"
jetpack 不能再像原来一样直接setContentView,需要转换成如下写法:
public class MainActivity extends AppCompatActivity {
ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 转换为 ActivityMainBinding
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
}
}
如3.2所言,setVm方法为编译器编译后会自动生成的方法,依据 name属性值生成。如未找到该方法,可以重新编译尝试。
binding.setVm(new MainViewModel(getApplication()));
binding.setLifecycleOwner(this);
至此,最简单的使用流程已经记录完毕。