Android Data Binding1(基础用法)

目前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("哈哈哈");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值