开启DataBinding功能很简单,只需要在APP的gradle中按如下方式配置即可:
android {
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
buildToolsVersion "26.0.0"
defaultConfig {
applicationId "com.qiangxi.databindingdemo"
minSdkVersion 16
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
//核心配置代码在这里
dataBinding{
enabled = true
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:26.+'
testCompile 'junit:junit:4.12'
}
配置好之后记得同步一下项目,就可以使用DataBinding的方式开发了。
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
移到layout标签中默认布局文件:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:text="dataBinding基本使用"/>
LinearLayout>
修改为dataBinding方式的布局文件:
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:text="dataBinding基本使用"/>
LinearLayout>
layout>
默认activity中的代码:
public class MainActivity extends AppCompatActivity {
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText("DataBinding的基本使用");
}
}
修改为dataBinding方式后activity中的代码:
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding mBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
mBinding.textView.setText("DataBinding的基本使用");
}
}
以上就是DataBinding的基本使用。
通过上面的简单示例代码我们可以很明显的看到使用DataBinding的简洁之处。
- 再也不需要编写findViewById了
这种简化的优势当需要初始化的控件多了之后会更加明显,并且这仅仅是DataBinding众多优点之中的一个而已,后续文章中我会带着大家体验DataBinding更多的优点。
我们知道,在Android Studio中是依靠gradle来管理项目的,在创建一个项目时,从开始创建一直到创建完毕,整个过程是需要执行很多个gradle task的,这些task有很多是系统预先帮我们定义好的,比如build task,clean task等,DataBinding相关的task也是系统预先帮我们定义好的,但是默认情况下,DataBinding相关的task在task列表中是没有的,因为我们没有开启dataBinding,但是一旦我们通过 dataBinding{enabled = true}的方式开启DataBinding之后,DataBinding相关的task就会出现在task列表中,每当我们执行编译之类的操作时,就会执行这些dataBinding Task, 这些task的作用就是检查并生成相关dataBinding代码,比如dataBindingExportBuildInfoDebug这个task就是用来导出debug模式下的build信息的。
项目中所有的task列表可以从Android Studio面板右侧贴边的Gradle中找到。
通过第一个问题的解释,我们也就知道了ActivityMainBinding这个类其实是系统帮我们自动生成的。
但是如果你在实际编写代码的过程中,你会发现并没有执行编译、运行之类等操作,ActivityMainBinding这个类就直接能用了,竟然还有这种操作?其实是Android Studio 这个IDE自动帮我们做了这一步,在默认情况下,系统会使用Android Studio为我们自动生成databinding相关的代码,但是这种方式生成的代码不能调试,如果你想通过点击ActivityMainBinding跳转到它的源码中,你会发现并不能如你所愿,而是会跳转到对应的布局文件中。那么如果我们确实要查看ActivityMainBinding的源码并且还想调试,我们就需要通过另外一种方式:手动编译代码。这两种方式可以通过Android Studio的设置面板修改。
根据第2个问题的解释,我们知道Android Studio可以自动生成DataBinding相关代码。
在以前,如果我们想使用dataBinding方式开发,还需要引入dataBinding的相关Library,但是现在我们不用引入这些library了,因为在我们配置完dataBinding{enabled = true}之后,系统会自动引入这些library,但是这些library的源码在哪里放着呢?我们可以找到Android Studio的安装路径,在
\plugins\android\lib
路径下找到data-binding.jar,比如我的路径则为:D:\Android\AndroidStudio\plugins\android\lib
,这个jar包中存放的就是DataBinding相关的源码,包括annotationprocessor,parser,tool,以及相关注解和类,这个源码就是让Android Studio有能力生成DataBinding相关代码的原因。
但是我们发现这些源码都已经被编译为class文件,想查看真正的源码还想看到对应的注释通过这个源码是不可能了。我们可以通过这个地址DataBinding的java源码地址 查询和下载DataBinding各个版本的源码和Javadoc。
ButterKnife很多人都用过,在以前的findViewById的时代,我们厌烦了写这些重复的代码,当有了ButterKnife之后,我们采用注解的方式来查找控件和注册监听,配合ButterKnife的插件,大大提升了我们的开发效率,一度成为开发神器,但是有了DataBinding之后,你会发现使用ButterKnife开发还是不够简洁:比如要获取editText的内容前必须要获取editText对象,给view添加监听前也必须要获取这个view对象等等。但是使用了DataBinding之后,这些冗余的代码统统都可以得到简化。
这个问题我也只能发表我个人的见解,不合适之处还请见谅和指出:虽然DataBinding已经推出了好几年,但是在初期DataBinding存在很多bug,会导致项目不稳定,写个demo还可以,但是应用到企业开发中的确要慎之又慎;后来随着DataBinding的发展,bug逐渐修复,但是IDE却始终跟不上脚步,导致DataBinding的一些错误很难得到定位,开发调试很困难;但是近段时间以来,随着IDE对DataBinding支持的加强,开发和调试也变得容易很多,感觉DataBinding的春天要到来了,但是好像还是没有太火起来,那到底是什么原因限制了DataBinding的发展呢?
其实,归根结底还是开发方式的转变让很多开发者一时无法接受,因为之前都是在java代码中与数据打交道,但是使用了DataBinding之后,数据直接和xml布局文件打交道了,这造成了布局文件与数据的高度耦合:一个布局文件只能展示某一个实体类的数据,如果想展示其他实体类的数据,很难做到,除非把布局代码重新拷一份然后更改实体类。这样高度耦合的缺点在更改包名时会更加严重。因为所有生成的dataBinding相关代码都存储在当前项目包名目录下的,并且我们在xml布局文件中引入也会引入一些当前包名的相关类,当更改包名时,Android Studio有时并不会检索到所有需要更改包名的地方,在这种情况下,一旦更改包名,等待我们的将是挨个找到被自动没有更改包名的类,然后我们手动修改,这个过程我想没人会高兴吧。
肯定要使用啊,开玩笑,不然写这个系列的文章搞毛啊!虽然更改包名的时候很烦,但是我们基本不会发生次次改包名的情况吧。即便更改包名很蛋疼,但相对于在编写代码时的爽快来说,个人认为还是不算什么的。毕竟使用dataBinding开发真的是很爽,可以少写N多代码,让我们的代码真的只专于业务。