Data Binding简介

Data Binding即数据绑定,使数据对象和xml布局绑定,支持双向绑定; 是一个实现数据和UI绑定的框架,是构建MVVM模式的一个工具。

Data Binding使用

1.在app模块下的build.gradle文件添加内容

android {

...

dataBinding {

enabled true

}

}

2.创建ViewModel 

class LoginModel() : ViewModel() {

var ld_phone: MutableLiveData = MutableLiveData()

var ld_code: MutableLiveData = MutableLiveData()

var ld_content: MutableLiveData = MutableLiveData()

}

3.布局转换

在layout布局中选中根布局进行转换 

Convert to data binding layout

 几个标签含义

layout 用作布局的根节点,只能包裹一个View标签,且不能包裹merge标签。data Data Binding的数据,只能存在一个data标签。variable data中使用,数据的变量标签,type属性指明变量的类,如com.alan.mvvm.viewmodel.LoginModel。name属性指明变量的名字,方便布局中使用。import data中使用,需要使用静态方法和静态常量,如需要使用View.Visble属性的时候,则需导入。type属性指明类的路径,如果两个import标签导入的类名相同,则可以使用alias属性声明别名,使用的时候直接使用别名即可。include View标签中使用,作用同普通布局中的include一样,需要使用bind:<参数名>传递参数。

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

xmlns:tools="http://schemas.android.com/tools">

name="model"

type="com.alan.mvvm.viewmodel.LoginModel"/>

name="activity"

type="androidx.fragment.app.FragmentActivity"/>

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/txt_cancel"

android:onClick="@{()-> activity.onBackPressed()}"

/>

android:id="@+id/txt_title"

app:layout_constraintTop_toTopOf="parent"

.../>

android:id="@+id/et_account"

android:text="@{model.ld_phone.get()}"

android:onTextChanged="@{(text, start, before, count)->model.onNameChanged(text)}"

...

/>

android:id="@+id/et_pwd"

android:text="@{model.code.get()}"

android:onTextChanged="@{model::onPwdChanged}"

...

/>

android:id="@+id/btn_login"

android:text="Sign in"

android:onClick="@{() -> model.login()}"

android:enabled="@{(model.code.get().isEmpty()||model.phone.get().isEmpty()) ? false : true}"

.../>

属性的引用 如果想使用ViewModel中成员变量,如直接使用model.ld_phone 事件绑定 事件绑定包括方法引用和监听绑定:

方法引用:参数类型和返回类型要一致,参考et_pwdEditTextandroid:onTextChanged引用。监听绑定:相比较于方法引用,监听绑定的要求就没那么高了,我们可以使用自行定义的函数,参考et_accountEditText的android:onTextChanged引用。

表达式 btn_loginButton在密码没有内容的时候是灰色的就是使用的表达式。

运算符 + - / * %字符串连接 +逻辑与或 && ||二进制 & | ^一元 + - ! ~移位 >> >>> <<比较 == > < >= <= (Note that < needs to be escaped as <)instanceofGrouping ()Literals - character, String, numeric, nullCast方法调用域访问数组访问三元操作符

4.生成绑定类并使用

布局文件创建完毕之后,点击Build下面的Make Project,让系统帮我生成绑定类ActivityLoginBinding

然后只需在LoginActivity 中完成绑定即可,绑定操作既可以使用,上述生成的ActivityLoginBinding也可以使用,自带的DataBindingUtil完成:

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

val binding: ActivityLoginBinding =DataBindingUtil.setContentView(this, R.layout.activity_login)

}

//DataBinding也支持在Fragment和RecyclerView中使用

@Override

public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

binding = DataBindingUtil.inflate(inflater, getContentViewId(), container, false);

return binding.getRoot();

}

2.使用生成的ActivitytLoginBinding

binding = ActivitytLoginBinding.inflate(inflater, getContentViewId(), container, false);

文章来源

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: