关于DataBinding的内容比较多,所以我准备分上下两篇.
整体的逻辑内容包含:
- 什么是视图绑定
- 视图绑定的使用
- 表达式的使用
- 常见的事件绑定
- Adapter适配器的处理
- 自定义绑定适配器
上篇主要讲怎么使用,如果已经对DataBinding有点了解的话,可以直接看下篇!
本文知识点
- 什么是视图绑定
- 视图绑定的使用
1. DataBinding(视图绑定)
其实关于视图绑定,官方的解释是说:可以以声明的格式将布局中的界面组件绑定到应用中的数据源. 其实就是把数据映射到xml布局文件中,用来渲染.那么为什么会有DataBinding(视图绑定)呢?因为视图绑定之前没有这种概念,所以也就没办法对比.但是在我的理解,视图绑定能有效的规范数据的流向.为什么这么说呢?看我下面的分析:
设想一个场景...
在之前我们写数据都是从Model层传递到Presenter层,最后在通过接口传递到View层.然后通过setText或者setAdapter设置相应的数据.但是如果这个时候发生了View层的页面变化,那么就需要更改Actvitiy中的代码.但是如果DataBinding把数据绑定到XML中的话,Activity中的代码就不需要修改了,这样就减少了代码之前的耦合.所以才有了DataBinding的数据绑定...(不知道为的理解是否正确.如果有不对的地方还请大神们指点!)
接下来在说一下我在项目中使用的时候发现的一些问题:
-
优点:
- 可以在布局中使用数据
- 解耦了数据的和Activity之间的耦合
- 支持表达式的使用
-
缺点:
- 排查错误比较费劲
- 表达式过程很难理解
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的内容,总结的就是以上这些.如果你还想知道什么,留言见