今天蓝鸥大连Android培训小编发布的这篇技术文章是来自蓝鸥大连Android开发培训讲师武奇老师的一篇外文译文,如果你英文很好的话,你可以直接看原文啦,好了,废话不多说,接下来开始技术分享。
Data Binding向导
本文档介绍如何使用Data Binding Library编写声明式布局,和使用更少的代码绑定你的应用程序中的逻辑和布局。
Data Binding Library提供了灵活性和广泛的兼容性——它是一个支持库,所以你可以在Android 2.1(API 7 )的版本之后使用。
想使用Data Binding,Android的Gradle插件版本更低为1.5.0-alpha1。
构建环境
要开始使用Data Binding,需要从SDK Manager的Support repository中下载。
要配置你的app使用Data Binding,需要在对应app的module中的build.gradle文件中添加dataBinding元素。
使用如下的代码片段配置DataBinding:
android {
....
dataBinding {
enabled = true
}
}
如果你的app依赖了一个使用了dataBinding的Library,那么你的app module也必须在build.gradle文件中配置好dataBinding。
Data Binding Layout Files
书写你的卓绝个data binding表达式
data binding的布局文件与以前有些不同,它是以layout标签为开始,之后里面跟着一个data标签和view标签。这个view标签就是在没有使用dataBinding时的布局文件。一个例子如下:
<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="com.example.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"/>
</LinearLayout></layout>
data里的variable标签,定义了一个可以用在layout里面的属性user
<variable name="user" type="com.example.User"/>
布局文件的属性赋值使用@{}语句。这里,TextView的text设置了user对象的firstName属性。
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"/>
Data Object(数据对象)
假设现在有一个普通的Java对象
public class User {
public final String firstName;
public final String lastName;
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
这种类型的对象数据不会改变。通常在应用程序中读取一次,之后并不会改变。还可能使用JavaBean对象:
public class User {
private final String firstName;
private final String lastName;
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return this.firstName;
}
public String getLastName() {
return this.lastName;
}
}
在dataBinding看来,上面两个类是”一样儿一样儿的”.TextView中使用了@{user.fistName}为android:text属性赋值,对卓绝个User类来说,会直接读取firstName属性;对第二个User类来说,会读取getFirstName()方法,或者,如果在User类中有跟属性名同名的方法,例如firstName(),也会读取。
Binding Data(绑定数据)
默认情况下,在layout为跟标签的布局文件写好之后,会自动生成一个Binding类,类名会根据布局文件名而来,首字母变为大写字母,并在后面加上Binding。例如上面的布局文件名为activity_main.xml,那么生成的类名即为ActivityMainBinding。这个类拥有从属性(例如:user对象)到布局文件的所有对应关系。并且知道如何通过绑定表达式进行赋值。The easiest means for creating the bindings is to do it while inflating(不会翻译了)。
@Overrideprotected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
User user = new User("Test", "User");
binding.setUser(user);
}
完成!运行程序,你会在界面上看到Test User,或者,你也可以通过如下的方式获得view:
ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
如果你在ListView或者Recyclerview的适配器中使用dataBinding,需要使用如下的方式:
ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false);//or
ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);
Binding Events(绑定事件)
事件可以直接绑定到程序中的一个方法上,类似于android:onClick可以分配给Activity一个方法.事件的属性名由监听器(Listener)里面的方法名决定(存在些许不同)。例如,View.OnLongClickListener有一个方法onLongClick(),所以这个事件的属性名就是android:onLongClick。分发一个事件给它的处理者,使用同样的绑定表达式,但是值换成方法名。例如,你的数据类对象有两个方法:
public class MyHandlers {
public void onClickFriend(View view) { ... }
public void onClickEnemy(View view) { ... }
}
使用绑定表达式为View分配点击监听:
<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="handlers" type="com.example.Handlers"/>
<variable name="user" type="com.example.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"
android:onClick="@{user.isFriend ? handlers.onClickFriend : handlers.onClickEnemy}"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"
android:onClick="@{user.isFriend ? handlers.onClickFriend : handlers.onClickEnemy}"/>
</LinearLayout></layout>
一些专有的点击事件处理者存在,并且它们需要一个除了android:onClick的其他属性来避免冲突。创建如下的属性来避免这样的冲突:
Class | Listener Setter |
SearchView | setOnSearchClickListener(View.OnClickListener) |
ZoomControls | setOnZoomInClickListener(View.OnClickListener) |
ZoomControls | setOnZoomOutClickListener(View.OnClickListener) |
正在努力创建中,请耐心等待。。