Android 中 JetPack(二)DataBinding(视图绑定)(上)

1,288 阅读3分钟

关于DataBinding的内容比较多,所以我准备分上下两篇.

整体的逻辑内容包含:

  • 什么是视图绑定
  • 视图绑定的使用
  • 表达式的使用
  • 常见的事件绑定
  • Adapter适配器的处理
  • 自定义绑定适配器

上篇主要讲怎么使用,如果已经对DataBinding有点了解的话,可以直接看下篇!

本文知识点

  • 什么是视图绑定
  • 视图绑定的使用

1. DataBinding(视图绑定)

其实关于视图绑定,官方的解释是说:可以以声明的格式将布局中的界面组件绑定到应用中的数据源. 其实就是把数据映射到xml布局文件中,用来渲染.那么为什么会有DataBinding(视图绑定)呢?因为视图绑定之前没有这种概念,所以也就没办法对比.但是在我的理解,视图绑定能有效的规范数据的流向.为什么这么说呢?看我下面的分析:

设想一个场景...

在之前我们写数据都是从Model层传递到Presenter层,最后在通过接口传递到View层.然后通过setText或者setAdapter设置相应的数据.但是如果这个时候发生了View层的页面变化,那么就需要更改Actvitiy中的代码.但是如果DataBinding把数据绑定到XML中的话,Activity中的代码就不需要修改了,这样就减少了代码之前的耦合.所以才有了DataBinding的数据绑定...(不知道为的理解是否正确.如果有不对的地方还请大神们指点!)

接下来在说一下我在项目中使用的时候发现的一些问题:

  • 优点:

    1. 可以在布局中使用数据
    2. 解耦了数据的和Activity之间的耦合
    3. 支持表达式的使用
  • 缺点:

    1. 排查错误比较费劲
    2. 表达式过程很难理解

2. DataBinding(视图绑定)的使用

2.1 前期准备

在使用DataBinding的使用之前,首先要在build.gradle中添加如下代码:

dataBinding {
    enabled = true
}

这个是开启DataBinding的关键.

其次就是在布局文件中添加标签,就想这样

<?xml version="1.0" encoding="utf-8"?>
<layout>

    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".databinding.TestKotlinActivity">

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

最后在代码中获取DataBinding的引用.

Kotlin代码示例:

// val binding = setContentView<ActivityTestKotlinBinding>(this, R.layout.activity_test_kotlin)
val binding: ActivityTestKotlinBinding = setContentView(this, R.layout.activity_test_kotlin)

以上两种方式否可以,不过在使用kotlin的时候需要导入一个引用

implementation "androidx.databinding:databinding-runtime:4.1.1"

java代码示例:

ActivityTestBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_test);

以上是获取databinding对象的方法,其实有些分可能有点莫名其妙,这个ActivityTestBinding类是从哪里来的,默认情况下,绑定类是根据布局文件的名称生成的,以大写字母开头,移除下划线 ( _ ),将后一个字母大写,最后添加后缀 Binding。

ps: 如何修改名称:

<layout>
    <data class="com.angle.android.TestJava">

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".databinding.TestJavaActivity">

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

<!--下面是一样的-->

<layout>

    <data class=".TestKotlin">

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".databinding.TestKotlinActivity">

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

其实这里的.就是项目结构中的包名和你写上包名是一样的,最后的那个就是生成的类名了.

具体的位置

墨迹半天终于把前期准备讲完了 ^_^!!!

2.2 具体使用

这个其实很简单,就是创建一个实体类,绑定到相应的视图里面.

kotlin代码示例:

//创建实体类
data class UserKotlin(val name: String, val id: String)

//绑定对象
val binding: TestKotlin = setContentView(this, R.layout.activity_test_kotlin)
//绑定对象
binding.userData = UserKotlin("笔墨Android","85757")

xml代码示例:

<layout>

    <data class=".TestKotlin">

        <variable
            name="userData"
            type="com.angle.android.databinding.bean.UserKotlin" />
            
        <variable
            name="userData"
            type="com.angle.android.databinding.bean.UserJava" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".databinding.TestKotlinActivity">

        <TextView
            android:id="@+id/name"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:gravity="center"
            android:text="@{userData.name}"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/id"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:gravity="center"
            android:text="@{userData.id}"
            app:layout_constraintTop_toBottomOf="@id/name" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

这里我把kotlin和java的示例都写在里面了,使用的时候记得区分.

java代码示例:

//创建dataBinding对象
TestJava binding = DataBindingUtil.setContentView(this, R.layout.activity_test_java);
//绑定对象
binding.setUserData(new UserJava("笔墨Android", "85757"));

杠精们是不是又该问这个有什么用了?其实还是挺有用的,设想一下如果你presenter拿到数据回来之后,直接把实体类丢给xml就可以了.如果添加什么字段的话,也只是需要更改xml就可以了.是不是很简单...

关于DataBinding的内容,总结的就是以上这些.如果你还想知道什么,留言见