Android DataBinding的基本用法

一、什么是DataBinding

DataBinding顾名思义数据绑定,就是一个数据绑定的库,
二、DataBinding所需的环境
Android Studio:1.3及以上 (更新Android Studio)
Gradle版本:1.5及以上
SDK版本:Android 2.1及以上
三、DataBinding的基本用法
(一)开启DataBinding
在Gradle配置一下
android {
    ....
    dataBinding {
        enabled = true
    }
}
这里还有个细节,开启DataBinding之前运行一下程序可以看到classes文件夹是这样的,

开启DataBinding之后再运行一下程序,再来看classes文件夹是这样的,多了一些东西。

(二)在布局中使用
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android" >

    <data>
        <variable
            name="user"
            type="com.ce.databindingtest.bean.User" />
    </data>

    <LinearLayout
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.ce.databindingtest.activity.MainActivity">
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="User name"
            android:text="@{user.userName}"/>
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Password"
            android:text="@{user.password}"/>
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="Login"/>
    </LinearLayout>
</layout>
以前我们要操作控件首先要对控件添加个id,然后在Activity中findViewById通过控件id找到它才能进行操作,后来有了ButterKnife这类通过注解来操作控件的库方便了很多,也使得代码更简洁,但也是要给控件添加个id,现在我们用DataBinding不需要添加id了。
从布局中可以看到根标签得是layout,里面第一个标签是data,从第二个标签起才是我们要显示的布局控件的开始,data标签就是数据相关的标签了,里面有个variable标签即变量嘛,既然是变量声明出来当然要有变量名name和类型type(哪个类的变量),在控件中使用的时候用"@{}"进行设置,像上面的布局EditText控件:
android:text="@{user.userName}"
(三)User类
package com.ce.databindingtest.bean;

public class User {
    private String userName;
    private String password;

    public User() {
    }

    public User(String userName, String password) {
        this.userName = userName;
        this.password = password;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
上面的布局中需要一个User类。
(四)中间类
此时先运行一下程序,再看下。

会发现还多了个ActivityMainBinding.class,这个类的名字是有规律的,前面的是布局的名称,后面再加个Binding,比如我现在的layout的名称是activity_main.xml,这个类的名字就是ActivityMainBinding,如果我把布局名称改为main_layout.xml再运行一下,

现在这个类的名称就是MainLayoutBinding了,点击进去看下,该类是继承自ViewDataBinding的,
public class MainLayoutBinding extends ViewDataBinding 
还有个setUser方法和getUser方法。
public void setUser(User user) {
        this.mUser = user;
        synchronized(this) {
            this.mDirtyFlags |= 1L;
        }

        this.notifyPropertyChanged(1);
        super.requestRebind();
    }

    public User getUser() {
        return this.mUser;
    }
这不就是我们定义的User类么(就是)。
(五)Activity
package com.ce.databindingtest.activity;

import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import com.ce.databindingtest.R;
import com.ce.databindingtest.bean.User;
import com.ce.databindingtest.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
        //使用DataBindingUtil的setContentView设置布局文件
        ActivityMainBinding _ViewDataBinding = DataBindingUtil.setContentView(this, R.layout.main_layout);
        User _User = new User("CE", "123456");
//        绑定数据
        _ViewDataBinding.setUser(_User);
    }
}
这里不需要使用Activity的setContentView()方法加载布局,而是用DataBindingUtil类的setContentView()方法,其实里面也是用传入的Activity调用setContentView()方法,看下DataBindingUtil的setContentView()方法的源码。
public static <T extends ViewDataBinding> T setContentView(Activity activity, int layoutId) {
        return setContentView(activity, layoutId, sDefaultComponent);
    }
    public static <T extends ViewDataBinding> T setContentView(Activity activity, int layoutId,
            DataBindingComponent bindingComponent) {
        activity.setContentView(layoutId);
        View decorView = activity.getWindow().getDecorView();
        ViewGroup contentView = (ViewGroup) decorView.findViewById(android.R.id.content);
        return bindToAddedViews(bindingComponent, contentView, 0, layoutId);
    }
返回的是<T extends ViewDataBinding>类型,我们刚才看的ActivityMainBinding类不就是继承ViewDataBinding的?所以用ActivityMainBinding类来接收,刚才我们也看到该类有个setUser()方法,所以new了个User()对象传进去,运行一下看看。

数据就这样被绑定了,是不是感觉很好用?好了,基本使用就这样。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值