概述
- 本节只针没用过DataBinding的入门介绍;
编译环境
- 在各moudule(app或者library)的build.gradle文件中添加以下代码
android { dataBinding { enabled = true } }
- 由于项目中开启了AndroidX组件库,所以不需要依赖相应第三方库;开启AndroidX组件库,需在整个项目的gradle.properties中添加以下代码
android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX android.enableJetifier=true
- 如果DataBinding要和ViewModel/LiveData/Lifecycle结合使用,需要在module的build.gradle文件的dependencies中添加对应的依赖项;
XML
- layout文件根节点变为<layout>,子节点为<data>和View树根节点,<data>的子节点有<import>和<variable>,代码如下
<layout> <data> <import type="com.example.android.ClassA"/> <variable name="varA" type="ClassA" /> </data> <!--View树根节点--> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/tv_title" android:layout_width="0dp" android:layout_height="wrap_content" android:gravity="center" android:textColor="@android:color/black" android:text="@{varA.hello}" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent"/> </androidx.constraintlayout.widget.ConstraintLayout> </layout>
- <data>节点中声明的变量,可以在View的属性中直接使用,
@{}
和@={}
表示绑定表达式,表达式的值就是对应的属性值;
代码
- 生成Binding对象
- 如果是Activity的布局文件,可以通过以下代码生成Binding对象
DataBindingUtil.setContentView(@NonNull Activity activity, int layoutId)
- 如果是普通layout文件,可以通过以下代码生成Binding对象
DataBindingUtil.inflate(@NonNull LayoutInflater inflater, int layoutId, @Nullable ViewGroup parent, boolean attachToParent)
- 如果是已经通过LayoutInflater解析出来的View,可以通过以下代码生成Binding对象
DataBindingUtil.bind(@NonNull View root)
- Binding类名默认根据layout命名生成,比如layout文件名为activity_main,那么Binding类名为ActivityMainBinding/ActivityMainBindingImp;
- Binding对象尽早生成,以防止View树的变更或者View的Tag被修改;
- 如果是Activity的布局文件,可以通过以下代码生成Binding对象
- 绑定数据
- 获取到Binding对象之后,就可以对在XML中声明的变量进行数据绑定,View会根据最新数据自动更新UI;
- 绑定数据对应的方法名根据XML中声明的变量名
也可以通过以下方法修改(variablId为BR中对应的id)binding.setVarA(ClassA a);
binding.setVariable(int variableId, @Nullable Object value)
网友评论