一、DataBinding 核心概念
定义 :DataBinding 是 Android Jetpack 的官方库,允许在布局文件中直接绑定 UI 组件到数据源,减少模板代码并实现自动更新。
核心优势:
-
消除
findViewById()
调用 -
自动 UI 更新(数据变化 → UI 刷新)
-
支持双向绑定(UI 变化 → 数据更新)
-
布局表达式支持逻辑运算
-
与 MVVM 架构完美契合
二、配置与基础使用
1. 启用 DataBinding
Kotlin
android {
buildFeatures {
dataBinding = true
}
}
2. 基础布局绑定 (activity_main.xml)
XML
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="com.example.User" />
</data>
<LinearLayout>
<TextView
android:text="@{user.name}" <!-- 单向绑定 -->
android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>
<EditText
android:text="@={user.email}" /> <!-- 双向绑定 -->
</LinearLayout>
</layout>
3. 在 Activity/Fragment 中绑定
Kotlin
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 数据绑定初始化
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
// 设置数据对象
binding.user = User("John", "[email protected]", true)
// 设置生命周期所有者(用于LiveData)
binding.lifecycleOwner = this
}
}
三、MVVM 模式集成 DataBinding
MVVM 架构图
bash
[View] ---(观察)---> [ViewModel] <---(管理)---> [Model]
↑ |
└──(DataBinding绑定)──┘
1. 创建 ViewModel
Kotlin
class UserViewModel : ViewModel() {
// 使用 LiveData 实现数据观察
private val _user = MutableLiveData<User>()
val user: LiveData<User> = _user
// 双向绑定的可观察字段
val inputText = ObservableField<String>("")
init {
_user.value = User("Alice", "[email protected]", true)
}
// 处理 UI 事件
fun updateUser() {
_user.value = User(inputText.get() ?: "", "", true)
}
}
2. 更新布局绑定
Kotlin
<data>
<variable
name="viewModel"
type="com.example.UserViewModel" />
</data>
<TextView
android:text="@{viewModel.user.name}" />
<EditText
android:text="@={viewModel.inputText}" /> <!-- 双向绑定到ViewModel -->
<Button
android:onClick="@{() -> viewModel.updateUser()}" /> <!-- 绑定点击事件 -->
3. Activity/Fragment 集成
Kotlin
class MainActivity : AppCompatActivity() {
private val viewModel: UserViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
// 绑定 ViewModel
binding.viewModel = viewModel
// 设置生命周期所有者
binding.lifecycleOwner = this
}
}