前言
使用DataBinding能让我们轻松实现MVVM框架设计。它可以直接将数据源绑定在UI组件上,并且自动为我们生成bind,即可直接引用view对象。话不多说,往下看吧。
1 使用前必要操作
首先在build.gradle(Module:app)
文件添加dataBinding
,否则无法使用dataBinding,如下所示:
//需要使用到apt
apply plugin: 'kotlin-kapt'
android {
...
dataBinding {
enabled = true
}
}
2 布局和绑定表达式
Databinding 布局使用稍微有点不同,它的文件起始根标签是<layout>
,接着在<layout>
中是两个同级元素<data>
元素和<view>
根元素,这个<view>
根元素就是我们要显示的视图。一个完整的简单布局文件如下所示:
<?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"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="user"
type="com.example.myapplication.User"/>
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView2"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
在data
内描述一个可能在布局中使用的user
可变参数(variable)
<variable name="user" type="com.example.User" />
表达式在布局中写入属性参数使用@{}
语法。如下面Textview
的所示,text
设置了user
类里的lastName
data class User(val firstName: String, val lastName: String)
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"/>
3 绑定数据
写完之后Make Project,Databinding库会为我们生成一个以Layout名字为基础的Binging类。例如:使用activity_main.xml文件Databinding会为我们生成ActivityMainBinding
类,类中保存着所有绑定还能为绑定表达式赋值。
在app运行时,可以将BBBBB
显示在界面上。具体代码如下所示:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
binding.user = User("iM", "BBBBB")
}
你也可以使用LayoutInflater获取view,代码如下所示:
val binding = ActivityMainBinding.inflate(getLayoutInflater())
setContentView(binding.root)
你还可以在Fragment
、或者RecyclerView.Adapter
中使用inflate()
,代码如下所示:
//ListItemBinding和ActivityMainBinding一样,都是自动生成的
val listItemBinding = ListItemBinding.inflate(layoutInflater, viewGroup, false)
//or
val listItemBinding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false)
以上几步就是DataBinding的简单使用,通过对数据源的绑定,可以直接给视图赋值。
总结
以上只是简单的DataBinding用法,在实际开发中应当尽量简洁。实际上DataBinding的魅力还不止于此,当你真正了解了双向绑定和DataBinding adapter之后你会写出更简洁的程序。
网友评论