DataBinding是google官方推出的用于降低UI和业务代码耦合的技术,很好的使用DataBnding可以有效的减少Activity的臃肿,省去大量的findViewById的代码使用。
gradle的配置其实并不复杂。只需要开启对于DataBinding的支持。
在android{}里面加上下面的代码支持。
// 用来判断是否开启DataBinding功能
buildFeatures{
dataBinding = true
}
google官网关于DataBinding最新版本和gradle开启DataBinding支持的描述:
Google官方Databinding
对于DataBinding而言主要是两方面的编码。Activity和xml以及数据Model的编码,首先看看xml方面的编码。
在构建XML中的databinding布局,可以使用AndroidStudio快捷组合键"alt+enter"后,选择点击 “Convert to data binding layout”,来快速生成dataBinding布局。代码如下:
<layout 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">
<data>
data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/user_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="user_name"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/user_age"
app:layout_constraintTop_toBottomOf="@id/user_name"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginTop="10dp"
android:text="user_age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
androidx.constraintlayout.widget.ConstraintLayout>
layout>
注意到这里将xml根代码的换成了
同时多出了 。
data class User(var age: Int, var name: String)
这里直接使用kotlin的Data类,该类类似于Java Bean类。当然你也可以直接创建常规的Class类。
在data中声明变量有两种方法:
<data>
<variable
name="user"
type="com.work.binding.practice.data.User" />
data>
variable的意思是"变量",顾名思义,你需要绑定的数据类就是写在这里面。name
类似于Java的变量名,type
类似于Java的类名,但是需要注意,这里必须给出完全路径。通过这个"variable"可以解析到数据类。
<data>
<import type="com.work.binding.practice.data.User"/>
<variable
name="user"
type="User" />
data>
这里使用了import
这个也是类似于Java的import,引入包名。name
改成数据类的类名。
通过@{}
绑定到UI界面上,代码如下:
<layout 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">
<data>
<import type="com.work.binding.practice.data.User"/>
<variable
name="user"
type="User" />
data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.MainActivity">
<TextView
android:id="@+id/user_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/user_age"
app:layout_constraintTop_toBottomOf="@id/user_name"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginTop="10dp"
android:text="@{String.valueOf(user.age)}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
androidx.constraintlayout.widget.ConstraintLayout>
layout>
<layout 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">
<data>
<import type="com.work.binding.practice.data.User"/>
<variable
name="user"
type="User" />
data>
<include
android:layout_width="match_parent"
android:layout_height="wrap_content"
layout="@layout/layout_title"
app:user="@{user}"/>
......省略代码......
layout>
<layout 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">
<data>
<import type="com.work.binding.practice.data.User"/>
<variable
name="user"
type="User" />
data>
......省略代码......
DataBinding不支持merge。
由于使用了DataBinding就可以不需要使用传统的setContentView(R.layout.activity_main)
,而是使用DataBindingUtil
。代码如下:
class MainActivity : AppCompatActivity() {
// 使用空安全操作符'?'
private var activityMainBinding:ActivityMainBinding? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
// 设置数据类给ActivityMainBinding
activityMainBinding?.user = User(21, "Jack")
}
}
由于我们使用了Kotlin所以其实上面的代码可以继续简化
class MainActivity : AppCompatActivity() {
private val activityMainBinding:ActivityMainBinding by lazy {
DataBindingUtil.setContentView(this, R.layout.activity_main)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 设置数据类给ActivityMainBinding,这里不需要使用空安全修饰符了
activityMainBinding.user = User(21, "Jack")
}
}
使用by lazy技术简化了一下,缺点是变量必须得是val属性的。
通过以上的编码,我们就可以成功的将User的数据显示到UI上面了。
(1) ActivityMainBinding类是插件自动生成的代码,该代码继承自ViewDataBinding,命名规则是基于xml的,xml名称是"activity_main",那么生成的代码就是ActivityMain后面加上’Binding’。
(2) ActivityMainBinding类可以调用XML上面的UI,比如上面的代码可以调用XML中的两个TextView,以及rootView
通过以上的编码可以看到使用DataBinding技术可以大大减少Activity的代码,减少Activity的臃肿。看到这里,大家可能在想如何更新UI界面上的数据呢?在下个文章我们将解决这个问题!