Android Jetpack之DataBinding

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<String> = MutableLiveData<String>()
    var ld_code: MutableLiveData<String> = MutableLiveData<String>()
    var ld_content: MutableLiveData<String> = MutableLiveData<String>()
}

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属性的时候,则需导入<import type="android.view.View"/>。type属性指明类的路径,如果两个import标签导入的类名相同,则可以使用alias属性声明别名,使用的时候直接使用别名即可。
  • include
    View标签中使用,作用同普通布局中的include一样,需要使用bind:<参数名>传递参数。
<?xml version="1.0" encoding="utf-8"?>
<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>
        <!--需要的viewModel,通过mBinding.vm=mViewMode注入-->
        <variable
            name="model"
            type="com.alan.mvvm.viewmodel.LoginModel"/>

        <variable
            name="activity"
            type="androidx.fragment.app.FragmentActivity"/>
    </data>

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

        <TextView
            android:id="@+id/txt_cancel"
            android:onClick="@{()-> activity.onBackPressed()}"
            />

        <TextView
            android:id="@+id/txt_title"
            app:layout_constraintTop_toTopOf="parent"
            .../>

        <EditText
            android:id="@+id/et_account"
            android:text="@{model.ld_phone.get()}"
            android:onTextChanged="@{(text, start, before, count)->model.onNameChanged(text)}"
            ...
            />

        <EditText
            android:id="@+id/et_pwd"
            android:text="@{model.code.get()}"
            android:onTextChanged="@{model::onPwdChanged}"
            ...
            />

        <Button
            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}"
            .../>


    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
  1. 属性的引用
    如果想使用ViewModel中成员变量,如直接使用model.ld_phone

  2. 事件绑定
    事件绑定包括方法引用和监听绑定:

  • 方法引用:参数类型和返回类型要一致,参考et_pwdEditTextandroid:onTextChanged引用。
  • 监听绑定:相比较于方法引用,监听绑定的要求就没那么高了,我们可以使用自行定义的函数,参考et_accountEditText的android:onTextChanged引用。
  1. 表达式
    btn_loginButton在密码没有内容的时候是灰色的就是使用的表达式。
  • 运算符 + - / * %
  • 字符串连接 +
  • 逻辑与或 && ||
  • 二进制 & | ^
  • 一元 + - ! ~
  • 移位 >> >>> <<
  • 比较 == > < >= <= (Note that < needs to be escaped as <)
  • instanceof
  • Grouping ()
  • Literals - character, String, numeric, null
  • Cast
  • 方法调用
  • 域访问
  • 数组访问
  • 三元操作符
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);

  • 21
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值