DataBinding使用教程(一):配置与基本使用

阅读 247
收藏 17
2017-09-12
原文链接:blog.csdn.net

配置DataBinding

开启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的方式开发了。

DataBinding的基本使用

使用步骤:

  1. 在默认的布局文件的最外层嵌套一对标签
  2. xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    移到layout标签中
  3. 在对应的activity中使用DataBindingUtil类的setContentView()方法替 换原有的setContentView()方法
示例代码如下:

默认布局文件:

<?xml version="1.0" encoding="utf-8"?>
<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方式的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<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的优点

通过上面的简单示例代码我们可以很明显的看到使用DataBinding的简洁之处。 - 再也不需要编写findViewById了

这种简化的优势当需要初始化的控件多了之后会更加明显,并且这仅仅是DataBinding众多优点之中的一个而已,后续文章中我会带着大家体验DataBinding更多的优点。

对可能产生的疑惑的解释

1. 为什么配置了 dataBinding{enabled = true}之后就可以使用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中找到。

2. ActivityMainBinding这个类从哪来的?

通过第一个问题的解释,我们也就知道了ActivityMainBinding这个类其实是系统帮我们自动生成的。
但是如果你在实际编写代码的过程中,你会发现并没有执行编译、运行之类等操作,ActivityMainBinding这个类就直接能用了,竟然还有这种操作?其实是Android Studio 这个IDE自动帮我们做了这一步,在默认情况下,系统会使用Android Studio为我们自动生成databinding相关的代码,但是这种方式生成的代码不能调试,如果你想通过点击ActivityMainBinding跳转到它的源码中,你会发现并不能如你所愿,而是会跳转到对应的布局文件中。那么如果我们确实要查看ActivityMainBinding的源码并且还想调试,我们就需要通过另外一种方式:手动编译代码。这两种方式可以通过Android Studio的设置面板修改。
设置面板修改生成方式

3.Android Studio为什么有能力生成DataBinding相关代码

根据第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。

4.DataBinding与ButterKnife的区别和联系

ButterKnife很多人都用过,在以前的findViewById的时代,我们厌烦了写这些重复的代码,当有了ButterKnife之后,我们采用注解的方式来查找控件和注册监听,配合ButterKnife的插件,大大提升了我们的开发效率,一度成为开发神器,但是有了DataBinding之后,你会发现使用ButterKnife开发还是不够简洁:比如要获取editText的内容前必须要获取editText对象,给view添加监听前也必须要获取这个view对象等等。但是使用了DataBinding之后,这些冗余的代码统统都可以得到简化。

5.那么问题来了,既然DataBinding这么666,为什么目前看来好像并没有火起来呢?毕竟dataBinding也发布好多年了。

这个问题我也只能发表我个人的见解,不合适之处还请见谅和指出:虽然DataBinding已经推出了好几年,但是在初期DataBinding存在很多bug,会导致项目不稳定,写个demo还可以,但是应用到企业开发中的确要慎之又慎;后来随着DataBinding的发展,bug逐渐修复,但是IDE却始终跟不上脚步,导致DataBinding的一些错误很难得到定位,开发调试很困难;但是近段时间以来,随着IDE对DataBinding支持的加强,开发和调试也变得容易很多,感觉DataBinding的春天要到来了,但是好像还是没有太火起来,那到底是什么原因限制了DataBinding的发展呢?

其实,归根结底还是开发方式的转变让很多开发者一时无法接受,因为之前都是在java代码中与数据打交道,但是使用了DataBinding之后,数据直接和xml布局文件打交道了,这造成了布局文件与数据的高度耦合:一个布局文件只能展示某一个实体类的数据,如果想展示其他实体类的数据,很难做到,除非把布局代码重新拷一份然后更改实体类。这样高度耦合的缺点在更改包名时会更加严重。因为所有生成的dataBinding相关代码都存储在当前项目包名目录下的,并且我们在xml布局文件中引入也会引入一些当前包名的相关类,当更改包名时,Android Studio有时并不会检索到所有需要更改包名的地方,在这种情况下,一旦更改包名,等待我们的将是挨个找到被自动没有更改包名的类,然后我们手动修改,这个过程我想没人会高兴吧。

那还要使用DataBinding吗?

肯定要使用啊,开玩笑,不然写这个系列的文章搞毛啊!虽然更改包名的时候很烦,但是我们基本不会发生次次改包名的情况吧。即便更改包名很蛋疼,但相对于在编写代码时的爽快来说,个人认为还是不算什么的。毕竟使用dataBinding开发真的是很爽,可以少写N多代码,让我们的代码真的只专于业务。

评论