赞
踩
DataBinding,即数据绑定,可使用MVVM(Model-View-ViewModel)模式,让项目结构清晰明了。通过ViewModel连接View和Model,使得View与Model层解耦,分层后各司其职,维护方便。
使用DataBinding需要引用第三方的Library。在Android Studio中,可以在build.gradle(Moudle:app)中,在android{…}中添加如下的代码:
android {
....
dataBinding {
enabled = true
}//放在前面也是可以的
}
同步之,即可完成DataBind的环境配置。
首先先有一个Bean类:
package com.example.ethan.databinding;//后续有用
/**
* Created by Ethan on 2016/3/15.
*/
public class User {//private属性也一样。但需要get/set方法
public String name;
public String phone;
public boolean isShow;
}
修改Layout.XML文件:
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user"//代表Bean类实例 type="com.example.ethan.databinding.User"//Bean类的完整路径 /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="60dp" android:layout_weight="1" android:background="#0ff" android:text="@{user.name}"//若Bean类属性为private,用get方法获取 android:textAlignment="center"/> </LinearLayout> </layout>
从上面可以看出DataBinding的布局文件不同于以前的,它是以layout作为根节点data作为绑定数据的节点。
在布局文件中,可以看出DataBinding的语法格式@{ 实例.属性 }。
如果需要绑定同一个Bean类的多个实例,可以修改data中的内容为:
<import
alias="MyUser"//当你不同包中导入相同类名就可以使用这个属性设置别名
type="com.example.ethan.databinding.User"/>
<variable
name="user"
type="MyUser"/>//上面使用的别名
<!--如果需要多个对象可如下进行添加实例-->
<variable
name="user1"
type="MyUser"/>//上面使用的别名
再来看看MainActivity中的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//ActivityMainBinding这个的名是根据布局文件名自动生成的类
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
User user = new User();
user.name="Tom";
user.phone="123456";
user.isShow=true;
binding.setUser(user);//设置绑定
}
这样最简单的Bean类属性绑定就完成了。 有人说,如果我没设定属性值,而在XML文件中引用了会不会报错呢?这个问题的答案可以在后面的进阶用法中寻找答案~
在官网文档中有这么一句话需要注意:
If you are using data binding items inside a ListView or RecyclerView adapter, you may prefer to use:
ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false); //or ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);
- 1
- 2
- 3
自定义属性的绑定只要2步即可。因为java.lang.* 包中的类会被自动导入,可以直接使用。
第一步:在XML文件中添加自定义属性:
<variable
name="gender"
type="String"/>
第二步:在MainActivity中绑定所需的值。
binding.setGender("Male");//在XML文件绑定时内部自动生成了get/set方法。
<TextView
android:text="@{user.lastName}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="@{user.isShow ? View.VISIBLE : View.GONE}"/>
上面的最后一句会报红,无视之。同时需要在data中导包:
<import type="android.view.View"/>
此处仅演示List。
XML布局文件:
<import type="java.util.ArrayList"/>//不要想着多态了==
<!--演示简单的用法,复杂的大家可以自己have a try-->
<variable
name="list"
type="ArrayList<String>"/>//你问我里面的"<"是什么鬼?其实就是"<"。为什么这么写?你可以试试,不然我也不想!!!
...
<TextView
android:layout_width="wrap_content"
android:layout_height="60dp"
android:layout_weight="1"
android:background="#f00"
android:text="@{list[1]}"//注意一下这个的取值方式,而且是从0开始的
android:textAlignment="center"/>
MainActivity文件:
ArrayList<String> list = new ArrayList<String>() {
{
add("arraylist");
add("ABCD");
}
};
binding.setList(list);
下面来总结下Array、List、Map的取值方式:
…
android:text="@{list[index]}"//通过索引获取,从0开始计算
…
android:text="@{array[index]}"//同上。
…
android:text="@{map[key]}"//通过key键获取值value
关于Map的取值可以看下下面2种可行的方式:
android:text='@{map["firstName"]}'
android:text="@{map[`firstName`}"
android:text="@{map["firstName"]}"//里面转义的其实就是双引号,但不能直接填双引号
android:text="@{user.displayName ?? user.lastName}"
相当于
android:text="@{user.displayName != null ? user.displayName : user.lastName}"
在Java中的诸多运算符在这也是一样适用的。
Mathematical + - / * %
String concatenation +
Logical && ||
Binary & | ^
Unary + - ! ~
Shift >> >>> <<
Comparison == > < >= <=
instanceof
Grouping ()
Literals - character, String, numeric, null
Cast
Method calls
Field access
Array access []
Ternary operator ?:
而以下几个则无法使用:
this
super
new
看官方文档说明:
Generated data binding code automatically checks for nulls and avoid null pointer exceptions. For example, in the expression @{user.name}, if user is null, user.name will be assigned its default value (null). If you were referencing user.age, where age is an int, then it would default to 0.
android:padding="@{large? @dimen/largePadding : @dimen/smallPadding}"
关于属性的绑定就说到这里,后续将介绍DataBinding的其他用法。
In the end,附上官网链接:http://developer.android.com/tools/data-binding/guide.html。
其中的Resources章节中的后面2个还未理解。希望大家多多留言交流~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。