Android DataBinding的基本用法

来源:互联网 发布:mac不能播放视频 编辑:程序博客网 时间:2024/05/29 07:28

一、什么是DataBinding

Google官方提供的文章
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()对象传进去,运行一下看看。
数据就这样被绑定了,是不是感觉很好用?好了,基本使用就这样。
0 0
原创粉丝点击