DataBinding的作用是直接让实体类的和布局中控件绑定,不需要代码中设置,只需给布局设置对象即可。
- DataBinding支持
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.study"
minSdkVersion 22
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
//需要添加DataBinding支持
dataBinding {
enabled = true
}
}
使用之前需要添加DataBinding支持。Kotlin项目需要另外的配置。目前Demo项目是Java项目,不过是Java和Kotlin混合使用。
- 新建一个实体类
Book,书名、作者名两个属性,一个构造方法。
class Book {
var name: String
var author: String
constructor(name: String, author: String) {
this.name = name
this.author = author
}
}
- 布局样式
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".activity.jetpack.DataBandingActivity">
<data>
<variable
name="Book"
type="com.example.study.jetpack.model.Book" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/bt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取数据"
/>
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:text='@{Book.name}'
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_author"
android:layout_width="wrap_content"
android:text='@{Book.author}'
android:layout_height="wrap_content" />
</LinearLayout>
</layout>
和以往不同,根布局是layout标签。variable标签中指定实体类和名称,如果实体类名称有重复的情况,可以指定别名。
- Activity中使用
class DataBindingActivity : BaseActivity(), View.OnClickListener {
companion object {
fun start(context: Context) {
val intent = Intent(context, DataBindingActivity::class.java)
context.startActivity(intent)
}
}
//实体类对象
lateinit var book: Book
//布局构建的dataBanding对象
lateinit var dataBinding: ActivityDataBandingBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
dataBinding= DataBindingUtil.setContentView(this, R.layout.activity_data_banding)
book = Book("呐喊", "鲁迅")
//设置对象
dataBinding.book = book
bt.setOnClickListener(this)
}
override fun onClick(v: View?) {
//点击重新赋值对象
dataBinding.book = Book("射雕英雄传", "金庸")
}
}
布局建好之后,build一下就会生成一个ActivityDataBindingBinding文件,需要的就是实例化它并设置具体的数据。
和之前的使用也是很像的。注意布局和实例化DataBinding对象即可。
还有很多其它的功能,比如设置数据的时候怎么拼接字符串之类。
感觉也有些不好的地方,布局,实体类,获取数据的部分,看代码逻辑的话需要三部分来回切换了。