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

来源:互联网 发布:什么软件可以做代理 编辑:程序博客网 时间:2024/06/10 05:24

配置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多代码,让我们的代码真的只专于业务。

原创粉丝点击