作者: weiyf
时间: 2016-11-14 09:34:30

DataBinding系列提纲概况:

  1. Data Binding —— 快速入门
  2. Data Binding —— 基础用法

前段时间一直在围绕MVPMVVM等模式在讨论,Data Binding 已经出来有一段时间了,是Google对MVVM模式在Android上的实现,本系列博客会对DataBinding进行系统的介绍和运用。

什么是Data Binding

Data Binding是在2015年7月发布的Android Studio 1.3版本引入的,在2016年4月的Android Studio 2.0上正式支持。目前还在持续优化与拓展。Data Binding是一个实现数据以及UI绑定的相关框架,是Google对MVVM模式在Android上的实现,可以直接将数据绑定到xml中,并实现自动刷新,使开发者在开发过程中能很方便的实现MVVM模式。

为什么要使用Data Binding

是什么原因驱使Google去开发一个这样的库,而又是什么原因让我们决定去使用这么一个库?我们先看看我们传统代码的写法:

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<TextView
android:id="@+id/first_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

<TextView
android:id="@+id/last_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
private TextView mFirstName;

private TextView mLastName;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mFirstName = (TextView) findViewById(R.id.firstName);
mLastName = (TextView) findViewById(R.id.lastName);
}


public void updateUser(User user) {
if (user == null) {
mFirstName.setText(null);
mLastName.setText(null);
} else {
mFirstName.setText(user.getFirstName());
mLastName.setText(user.getLastName());
}
}

我们经常会看到这样的UI。我们一般会在一些控件上一个一个的添加id,然后回到java代码,一个一个的去调用findViewById()方法去实例化它们,然后才能进行赋值或其他操作。我们会发现,仅仅是那么两行是真正的逻辑,前面有着一堆的类似于findViewById()等的“垃圾代码”。对于类似findViewById()setText()setVisiblity()setOnClickListener()等这些无用代码,我们可以使用Data Binding来很好的规避这些毫无营养的代码。

简单来说,Data Binding可以提升开发效率,节省了编写无用代码的时间,性能高,功能强大。

Data Binding的优势以及劣势

优势

  • 上面说到的提高开发效率,减少编写不必要的代码。
  • xml变为UI的唯一数据来源。
  • 性能比手写findViewById()要好。
  • 保证执行于主线程。

劣势

  • IDE支持还不是特别完善,表现在一些代码提示和表达式支持
  • 报错不是特别友好,表现于一错就全错,需要在一堆报错中找到真正需要的报错信息。
  • 重构支持并不太好,表现于重构xml,java代码不会自动跟着重构。

总的来说,在优势上,这些劣势基本上可以忽略不计了,只要用熟练了,表达式的编写和寻找报错信息都会易如反掌。而且Android Studio现在在慢慢的完善这块的缺陷。

如何使用Data Binding

确保你的Android Studio版本在1.3或以上和Gradle插件在1.5.0-alpha1或以上。并且有用于接受新事物的心态 <( ̄3 ̄)> 。

Gradle

Data Binding使用起来非常简单,Android Studio已经对Data Binding做了支持,只需要在app module的构建文件(build.gradle)上加上以下代码就可以:

android {
...
dataBinding {
enabled true
}
}

layout

把普通的布局的根节点修改为layout,然后把原来的layout添加到layout节点下:

<layout>

// 这里是原来的layout

</layout>

完成以上操作之后,Android Studio就帮我们生成改布局对应的*Binding类

Binding类生成规则

在默认情况下,一个绑定类是基于布局文件的名字生成的,将布局文件的名字转换为“Pascal”命名(也就是首字母大写)并在后面加”Binding”。上面的布局文件名字为main_activity,所以生成的类的名字为MainActivityBinding

view的生成规则也类似,如果有一个TextView的id为first_name,则会生成名为firstName的TextView。

我们可以通过调整data标签的class属性,Binding类可以被重命名或者放置在不同的包中。

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

编写你的第一个Data Binding Sample

<layout>

<!--使用data标签的class属性来重命名Binding类或者决定其放置的包的位置-->

<data class="GettingStartedBinding">

<!--layout中所用到的变量-->

<variable
name="user"
type="cn.weiyf.databindingsample.entity.User"/>
</data>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="@dimen/activity_horizontal_margin"
android:orientation="vertical">

<!--绑定变量的属性值-->

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{user.firstName}"/>

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{user.lastName}"/>


</LinearLayout>

</layout>

data标签中的user变量描述了一个即将会在这个布局中用到的属性。

   @Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mGettingStartedBinding = GettingStartedBinding.inflate(inflater, container, false);
// or
// mGettingStartedBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_getting_started, container, false);
return mGettingStartedBinding.getRoot();
}

@Override
protected void initViews(@Nullable Bundle bundle) {
mGettingStartedBinding.setUser(new User("firstName", "lastName"));
// or
// mGettingStartedBinding.setVariable(BR.user, new User("firstName", "lastName"));
}

就这样,你就省去了一堆无用代码。看起来干净整洁多了。

示例代码

本系列博客代码示例

展望

下一篇博客,我们将了解一下Data Binding的基础用法,包括变量的绑定和一些事件的处理。