Android Data Binding1(基础用法)

来源:互联网 发布:js if多条件并列判断 编辑:程序博客网 时间:2024/06/13 23:26

目前Data Binding只能在Android Studio 1.3以上版本且gradle版本也必须为1.3以上的,所以没升级的先升级装备吧。

需要使用Data Binding,只需要在项目的build.gradle文件下添加如下代码就可以了:

android {    …    dataBinding {        enabled = true    }}

使用Data Binding前要知道三点:

在需要绑定的xml布局中,我们需要用< layout> 作为最外层的布局
它是在xml布局文件中来完成数据的绑定的,所以在< layout> 布局中包含一个< data> 区域,在其中设置绑定到xml的数据Model
得到数据Model后,采用@{}表达式绑定数据到相应的控件上

示例Demo:
xml文件:

<layout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools">    <data>        <variable            name="user"            type="com.sunzxyong.databinding.User"/>    </data>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="match_parent"        android:orientation="vertical"        tools:context=".MainActivity">        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="@{user.userName}" />        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="@{user.userPassword}" />    </LinearLayout></layout>

将com.sunzxyong.databinding包下User类的一个对象绑定到了布局中,name=“user”就是给User定义一个名为user变量(名字可以随便取),之后通过@{user.userName}获得这个对象的用户名设置给TextView(其中user.userName获取数据的根源就是它是访问user对象中的getUserName()方法来获取数据)。

User类:

public class User {    private String userName;    private String userPassword;    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }    public String getUserPassword() {        return userPassword;    }    public void setUserPassword(String userPassword) {        this.userPassword = userPassword;    }    public User(String userName, String userPassword) {        this.userName = userName;        this.userPassword = userPassword;    }}

activity使用:

protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        ActivityMainBinding mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);        User user = new User("Sunzxyong", "12345678");        mBinding.setUser(user);    }

我们在布局文件中的区域定义了一个User类型的user变量,我们在得到它的ViewModel对象后就可以通过调用setUser()方法来设置数据,那么ViewModel类是什么呢?在默认情况下系统会根据xml布局的名字来命名自动生成ViewModel类,比如刚刚我们的布局名为activity_main,那么它就会以 _ 下划线为分隔点命名结尾再加上Binding,所以这时我们的ViewModel是ActivityMainBinding,我们通过DataBindingUtil.setContentView()来获得对应xml文件的ViewModel,当然还有常用的DataBindingUtil.inflate(),如果绑定ListView或者RecyclerView的Item我们则通过:

ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false);
//or
ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);

最后我们通过ViewModel把数据传递给View层显示。

自定义Binding Class Name,也就是自定义ViewModel类名,不是用系统默认根据xml文件名生成的

我们知道系统默认是根据xml布局文件名来生成Binding Class Name的,如:first_activity.xml,那么生成的Binding Class Name就是FirstActivityBinding,如果该app module的包名为com.sunzxyong.hello,那么生成的Bindind Class Name所处的依赖的包为com.sunzxyong.hello.databinding,在使用时候AS会自动导入该包,如:

import com.sunzxyong.hello.databinding.FirstActivityBinding
那么怎么自定义Binding Class 名呢?就是通过设置节点中class的名字就是我们自定义的Binding Class 名字,比如我们把Binding Class 名改为MyBinding,则:

<data class="MyBinding">...</data>

则该xml的Binding Class Name为MyBinding,代码中获取就变为这样了:

MyBinding mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
而它的默认依赖包名也是在module包下的databinding包中。
当然也可以自己定义Binding Class 的包名:

<data class="com.example.MyBinding">    ...</data>

注意自定义Binding Class Name时,一定要把包名带上,免得跨包数据使用异常

1.Data Binding类型详解

1.1 imports

就像Java代码一样,我们可以使用import导入我们在xml文件绑定数据时需要使用到的类,如我们需要使用到系统中的View类,可以这样:

<data>    <import type="android.view.View"/></data>

然后使用它对控件进行相应属性值的绑定,如:

<TextView   android:text="@{user.userName}"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:visibility="@{user.isExist? View.VISIBLE : View.GONE}"/>

这样我们就可以使用View类的一些值,通过@{}来绑定这些值,用三元表达式进而决定控件的可见性。

1.2 class name conflicts类名冲突

如果我们自己创建了一个类名也为View,如:

public class View {    private int width;    private int height;    /*    * getter and setter ......    * */}

很明显这和系统中的View类名一样,那么在xml中怎么区别这两个不同的类呢?就是通过设置别名来区分。如:

<data>    <import type="android.view.View"/>    <import type="com.sunzxyong.databinding.View"        alias="MyView"/></data>

我设置了我自己定义的View别名为MyView,那么对控件进行数据绑定时候就使用这个别名,如:

<TextView   android:text="@{MyView.width}"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:visibility="@{user.isExist ? View.VISIBLE : View.GONE}"/>

1.3 List集合的使用

<data>    <import type="com.sunzxyong.databinding.User"/>    <import type="java.util.List"/>    <variable name="userList" type="List&lt;User>"/></data>

这里我们定义了一个List 这样的一个集合,名为userList,其中特别注意一点,在@{}表达式中不支持左括号,所以我们需要用转义字符代替左括号,然后在控件中获取集合的数据是通过userList[0]来获取的,这点和数组一样,而我们定义的是List集合,所以最终获取第一位用户的用户名是这样的:userList[0].userName,然后绑定数据在控件上。

<TextView   android:text="@{userList[0].userName}"   android:layout_width="wrap_content"   android:layout_height="wrap_content"/>

这里打印出来的将是集合中第一个元素的userName。

如果index索引需要动态改变,那么就这样:

<data>    <import type="java.util.List"/>    <variable name="list" type="List&lt;String>"/>    <variable name="index" type="int"/></data>…android:text="@{list[index]}"

1.4 Variables变量

【注意一点】java.lang.*包下的类是不需要导入的,因为这和java一样lang包下的类都是自动导入进去了,如:

<data>    <variable            name="number"            type="String"/></data>

绑定数据:

<TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="@{number}" />

然后通过代码设置mBinding.setNumber(“888888”);那么屏幕上显示将是888888。
因为自动导入了lang包,可以直接使用String、int、boolean等类,这些变量在没有传递值的情况下和java一样,都有默认值,引用类的为null,int为0,boolean为false等。

2 设置View的id activity中获取控件

虽然说Data Binding这种分层模式使得我们对数据的传递简单明了,一般情况下我们可以不设置View的id,不使用findViewById即可对View进行数据上一系列的操作,不过有时候根据情况我们需要对某些View设置id,但是还是可以不findViewById即可得到该控件的对象,因为设置id后ViewDataBinding类会自动生成对应的控件对象,如:

        <TextView            android:id="@+id/tvmsg"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="@{user.Msg}"            />

在Activity中获取控件,然后就可以对控件进行操作了

   mainBinding  = DataBindingUtil.setContentView(this, R.layout.activity_main);        tv_msg=mainBinding.tvmsg;        tv_msg.setText("哈哈哈");
0 0
原创粉丝点击