DataBinding初步介绍(我以后要是再翻译文章,那肯定是在代表我心情不错)

本文介绍如何使用DataBindingLibrary简化Android应用开发,通过声明式布局减少代码量,实现数据与UI的灵活绑定。涵盖构建环境配置、布局文件编写、数据绑定及事件绑定等内容。

原文链接(自备梯子):原文

Data Binding向导

本文档介绍如何使用Data Binding Library编写声明式布局,和使用最少的代码绑定你的应用程序中的逻辑和布局.
Data Binding Library提供了灵活性和广泛的兼容性——它是一个支持库,所以你可以在Android 2.1(API 7+)的版本之后使用.
想使用Data Binding,Android的Gradle插件版本最低为1.5.0-alpha1.

构建环境

要开始使用Data Binding,需要从SDK ManagerSupport repository中下载.
要配置你的app使用Data Binding,需要在对应app的module中的build.gradle文件中添加dataBinding元素.

使用如下的代码片段配置DataBinding:

android {
    ....
    dataBinding {
        enabled = true
    }
}

如果你的app依赖了一个使用了dataBindingLibrary,那么你的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"/>

布局文件的属性赋值使用@{}语句.这里,TextViewtext设置了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(不会翻译了).

@Override
protected 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的其他属性来避免冲突.创建如下的属性来避免这样的冲突:
(不要问我这句话在说啥,我没看懂)

ClassListener Setter
SearchViewsetOnSearchClickListener(View.OnClickListener)
ZoomControlssetOnZoomInClickListener(View.OnClickListener)
ZoomControlssetOnZoomOutClickListener(View.OnClickListener)

未完…(不一定待续……)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值