Android Data Binding入门

什么是DataBinding?

Android团队发布了一个数据绑定框架(Data Binding Library),以后可以直接在layout布局xml文件中绑定数据库,无需再findViewById,然后手工设置数据。

DataBinding的优势

Data Binding 解决了 Android UI 编程中的一个痛点,官方原生支持 MVVM 模型可以让我们在不改变既有代码框架的前提下,非常容易地使用这些新特性。其实在此之前,已经有些第三方的框架(RoboAndroid) 可以支持 MVVM 模型,无耐由于框架的侵入性太强,导致一直没有流行起来。

MVVM

这里写图片描述 

MVVM基本上和MVP一模一样,感觉只是名字替换了一下。他的关键技术就是今天的主题(Data Binding)。View的变化可以自动的反应在ViewModel,ViewModel的数据变化也会自动反应到View上。这样开发者就不用处理接收事件和View更新的工作,框架已经帮你做好了。

配置

在app module build.gradle中配置下面内容:

dataBinding {
    enabled = true
}
用法
UI绑定
1.首先改写layout布局文件,很简单,用<layout>标签来包裹这个布局文件,如下:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <LinearLayout
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.jackie.myapplication.MainActivity"
        android:orientation="vertical">

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onTextChanged="@{ presenter.onTextChanged }"
            android:hint="请输入First Name" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="请输入Last Name" />

        <TextView
	    android:id="@+id/first_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"/>

        <TextView
            android:id="@+id/last_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"/>
    </LinearLayout>
</layout>
2.改写Java代码

从上面的代码可以看出,当启用Data Binding后,会根据布局文件的名字生成一个Binding对象,生成规则如下:将每个单词的首字母大写,然后组合在一起,以Binding结尾即可,因此R.layout.activity_main生成了ActivityMainBinding对象。有人可能会问,上面的firstName是怎么来的呢?不要忘了,刚才我们给TextView设置id,分别为R.id.first_name,R.id.last_name,所以将两个单词组合,首字母大写,保留第一个单词的小写字母,mBinding.firstName和mBinding.lastName实际上就能获取到对应的TextView,从此告别findViewById了。是不是很赞?

所以上面的代码,运行结果如下:


可以看到,下面两个TextView都被赋值了。有人问,能不能不用id来赋值,也就是,如果我上面两个TextView没有设置id,会出现什么下面情况:

Android Studio对Data Binding的支持还是挺智能的,马上就提示我们没有找到相应的id,因此可以用下面的方法来做。继续改写layout布局文件:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="employee"
            type="com.jackie.myapplication.Employee"/>
    </data>

    <LinearLayout
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.jackie.myapplication.MainActivity"
        android:orientation="vertical">

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onTextChanged="@{ presenter.onTextChanged }"
            android:hint="请输入First Name" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="请输入Last Name" />

        <!-- 方法引用 -->
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="@{ employee.firstName }"/>
			
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="@{ employee.lastName }"/>
    </LinearLayout>
</layout>
首先将Employee对象以参数的形式配置在xml中,然后直接在android:text通过@{ 对象.属性 }来直接从该对象获取数据,配置好后,最后不要忘了,一定要把设置Employee对象set进来(Java代码set, XML代码get),方法有两种:


这样,运行出来的效果和上面是一样的,是不是更简单了。

事件绑定

下面来看,怎么绑定事件,绑定事件有两种方式:方法引用和监听器绑定。

1.方法引用

方法引用要求我们定义的方法和控件原本的事件方法名称和参数必须一致,比如我们在MainActivity.java中定义个内部类:


可以看到,该内部类中定义两个方法,onTextChanged和onClick,该两个方法的名称和参数必须跟系统提供的保持一致,然后就是根据自己的需要实现逻辑即可。继续改写layout布局文件,在<data>标签下添加添加内容:


通过箭头所标识的方法来注册onTextChanged和onClick事件即可。最后别忘了设置Presenter对象:



这种方法的好处就是代码可读性很强,跟UI绑定的形式差不多,缺陷就是,事件的方法名和能够传递的传递的参数单一,只能和系统保持一致,假如,我们需要把事件点击的对象回传,该怎么弄呢,这就要用到第二种绑定方法:

2.监听器绑定

同上,在Presenter中添加下面的定义:


方法名和传递的参数可以随意,实现自己的逻辑,继续改写layout布局文件:


写法也很固定@ { () -> presenter.onClickListenterBinding(employee) }直接回传对象即可。这种写法称为Lambda表达式

上面简单说了一下UI绑定和事件绑定的方法,如果想知道原理,可以去读一下Data Binding编译时生成的中间文件,目录如下:





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值