Skip to content

DataBinding 表达式语言

一、表达式语言概述

1.1 什么是 DataBinding 表达式

DataBinding 表达式语言是嵌入在 XML 布局文件中的一种声明式语言,允许开发者在布局中直接使用代码逻辑。它提供了类似编程语言的功能,包括运算符、条件判断、集合操作等,让 UI 与数据的绑定更加灵活和强大。

传统方式的局限:

kotlin
// 传统方式:需要在 Java/Kotlin 中预处理数据
val displayName = if (user.firstName != null && user.lastName != null) {
    "${user.firstName} ${user.lastName}"
} else {
    user.nickName ?: "Unknown"
}

binding.textView.text = displayName

使用表达式语言:

xml
<!-- 布局中直接处理逻辑 -->
<TextView
    android:text="@{user.firstName != null && user.lastName != null ? user.firstName + ` ` + user.lastName : user.nickName ?: `Unknown`}" />

1.2 表达式的语法特点

  1. 简洁性:一行代码完成复杂逻辑
  2. 声明式:UI 逻辑直接写在布局中
  3. 类型安全:编译时检查
  4. 功能丰富:支持运算符、条件、集合操作等

1.3 表达式的适用场景

推荐使用表达式:

  • 简单的数据处理
  • UI 显示格式化
  • 条件判断
  • 字符串拼接

不推荐使用表达式:

  • 复杂业务逻辑
  • 网络请求
  • 数据库操作
  • 耗时计算

二、条件表达式

2.1 三元运算符

基本语法

xml
<!-- 三元运算符:条件 ? 真值 : 假值 -->
<TextView
    android:text="@{user.isVip ? `VIP 用户` : `普通用户`}" />

<!-- 嵌套三元运算符 -->
<TextView
    android:text="@{user.status == 1 ? `进行中` : user.status == 2 ? `已完成` : `已取消`}" />

实际应用

xml
<!-- 用户等级显示 -->
<TextView
    android:id="@+id/tv_level"
    android:text="@{user.level == 1 ? `青铜` : 
                  user.level == 2 ? `白银` : 
                  user.level == 3 ? `黄金` : 
                  user.level == 4 ? `铂金` : 
                  user.level == 5 ? `钻石` : `未知`}" />

<!-- 价格显示 -->
<TextView
    android:id="@+id/tv_price"
    android:text="@{product.discountPrice != null ? `¥${product.discountPrice}` : `¥${product.price}`}" />

<!-- 库存状态 -->
<TextView
    android:id="@+id/tv_stock"
    android:text="@{product.stock > 100 ? `充足` : 
                  product.stock > 10 ? `紧张` : `缺货`}" />

2.2 空值合并运算符 (?😃

基本语法

xml
<!-- 空值合并:值 ? : 默认值 -->
<TextView
    android:text="@{user.nickName ?: `默认昵称`}" />

<!-- 与三元运算符结合 -->
<TextView
    android:text="@{user.realName ?: user.nickName ?: `未知用户`}" />

实际应用

xml
<!-- 用户信息显示 -->
<TextView
    android:id="@+id/tv_name"
    android:text="@{user.displayName ?: user.firstName + ` ` + user.lastName ?: `匿名用户`}" />

<!-- 头像显示 -->
<ImageView
    app:circleImageUrl="@{user.avatarUrl ?: `@{defaultAvatar}`}" />

<!-- 地址显示 -->
<TextView
    android:id="@+id/tv_address"
    android:text="@{user.detailAddress ?: user.province + user.city + user.district}" />

2.3 逻辑运算符

&&(逻辑与)

xml
<!-- 两个条件都满足 -->
<TextView
    android:visibility="@{user.isLogin && user.hasPermission ? View.VISIBLE : View.GONE}" />

<!-- 多个条件 -->
<Button
    android:enabled="@{!TextUtils.isEmpty(viewModel.username) 
                     && !TextUtils.isEmpty(viewModel.password)
                     && viewModel.isNetworkAvailable}" />

||(逻辑或)

xml
<!-- 任一条件满足 -->
<TextView
    android:visibility="@{user.isVip || user.isPremium ? View.VISIBLE : View.GONE}" />

<!-- 多个或条件 -->
<View
    android:visibility="@{user.role == `admin` 
                       || user.role == `manager` 
                       || user.role == `editor` 
                       ? View.VISIBLE : View.GONE}" />

!(逻辑非)

xml
<!-- 取反 -->
<TextView
    android:visibility="@{!user.isBlocked ? View.VISIBLE : View.GONE}" />

<!-- 非空检查 -->
<Button
    android:enabled="@{!TextUtils.isEmpty(user.email)}" />

2.4 复杂条件组合

xml
<!-- 复杂条件组合 -->
<TextView
    android:id="@+id/tv_status"
    android:text="@{order.status == `pending` && order.payment == null ? `待支付` :
                  order.status == `pending` && order.payment != null ? `已支付` :
                  order.status == `shipped` ? `已发货` :
                  order.status == `completed` ? `已完成` :
                  `异常订单`}" />

<!-- 日期条件 -->
<TextView
    android:id="@+id/tv_deadline"
    android:text="@{order.deadline <= System.currentTimeMillis() ? `已过期` : 
                  order.deadline - System.currentTimeMillis() < 86400000 ? `24 小时内` :
                  `未到期`}" />

2.5 可见性控制

xml
<!-- 布尔值控制可见性 -->
<View
    android:visibility="@{showDetail ? View.VISIBLE : View.GONE}" />

<!-- 可空布尔控制 -->
<View
    android:visibility="@{user != null ? View.VISIBLE : View.GONE}" />

<!-- 集合非空控制 -->
<View
    android:visibility="@{items != null && !items.isEmpty() ? View.VISIBLE : View.GONE}" />

<!-- 字符串非空控制 -->
<View
    android:visibility="@{!TextUtils.isEmpty(description) ? View.VISIBLE : View.GONE}" />

三、三元运算符高级用法

3.1 嵌套三元运算符

xml
<!-- 多层嵌套 -->
<TextView
    android:text="@{user.age < 18 ? `未成年` :
                  user.age < 30 ? `青年` :
                  user.age < 50 ? `中年` :
                  `老年`}" />

<!-- 结合空值合并 -->
<TextView
    android:text="@{user.age != null ? 
                  (user.age < 18 ? `未成年` : 
                   user.age < 30 ? `青年` : 
                   user.age < 50 ? `中年` : `老年`) :
                  `年龄未知`}" />

3.2 三元运算符与集合

xml
<!-- 集合大小判断 -->
<TextView
    android:text="@{cart.items.size() == 0 ? `购物车为空` :
                  cart.items.size() == 1 ? `1 件商品` :
                  cart.items.size() + ` 件商品`}" />

<!-- 列表状态 -->
<TextView
    android:text="@{posts.isEmpty() ? `暂无内容` :
                  posts.size() == 1 ? `1 条动态` :
                  posts.size() + ` 条动态`}" />

3.3 三元运算符与数值比较

xml
<!-- 数值范围判断 -->
<TextView
    android:text="@{score < 60 ? `不及格` :
                  score < 70 ? `及格` :
                  score < 80 ? `良好` :
                  score < 90 ? `优秀` : `杰出`}" />

<!-- 价格区间 -->
<TextView
    android:text="@{price < 100 ? `便宜` :
                  price < 500 ? `适中` :
                  price < 1000 ? `较贵` : `昂贵`}" />

3.4 三元运算符与字符串

xml
<!-- 字符串包含判断 -->
<TextView
    android:text="@{email.contains(`@`) ? `邮箱格式正确` : `邮箱格式错误`}" />

<!-- 字符串长度判断 -->
<TextView
    android:text="@{password.length() < 6 ? `密码太短` :
                  password.length() < 10 ? `密码强度一般` :
                  `密码强度足够`}" />

四、集合操作

4.1 集合大小

xml
<!-- 获取集合大小 -->
<TextView
    android:text="@{cart.items.size() + ` 件商品`}" />

<!-- 判断是否为空 -->
<TextView
    android:visibility="@{posts.isEmpty() ? View.GONE : View.VISIBLE}" />

<!-- 大小比较 -->
<TextView
    android:text="@{friends.size() > 100 ? `好友太多啦` : `还有空间`}" />

4.2 集合元素访问

xml
<!-- 通过索引访问 -->
<TextView
    android:text="@{items.get(0).name}" />

<!-- 第一个元素 -->
<TextView
    android:text="@{posts.get(posts.size() - 1).title}" />

<!-- 结合空值合并 -->
<TextView
    android:text="@{items.size() > 0 ? items.get(0).name : `暂无`}" />

4.3 集合遍历(间接)

DataBinding 表达式不支持直接遍历,但可以通过其他方法实现:

xml
<!-- 通过 ViewModel 处理遍历结果 -->
<TextView
    android:text="@{viewModel.joinNames(users)}" />
kotlin
// ViewModel 中实现
fun joinNames(users: List<User>): String {
    return users.joinToString(", ") { it.name }
}

4.4 集合常用操作

xml
<!-- 判断包含 -->
<TextView
    android:text="@{tags.contains(`热门`) ? `是热门标签` : `普通标签`}" />

<!-- 结合条件 -->
<TextView
    android:text="@{categories.size() > 5 ? `分类太多` : categories.size() + ` 个分类`}" />

4.5 Map 操作

xml
<!-- Map 取值 -->
<TextView
    android:text="@{user.attributes.get(`nickname`)}" />

<!-- Map 判断包含 key -->
<TextView
    android:visibility="@{user.attributes.containsKey(`vip`) ? View.VISIBLE : View.GONE}" />

<!-- Map 结合空值合并 -->
<TextView
    android:text="@{user.attributes.get(`level`) ?: `普通用户`}" />

五、方法调用

5.1 调用无参方法

xml
<!-- 调用无参方法 -->
<TextView
    android:text="@{viewModel.getUserName()}" />

<!-- 调用返回字符串的方法 -->
<TextView
    android:text="@{formatDate(order.createdAt)}" />

5.2 调用带参方法

xml
<!-- 调用带参方法 -->
<TextView
    android:text="@{formatCurrency(product.price, `CNY`)}" />

<!-- 多个参数 -->
<TextView
    android:text="@{String.format(`%s 的%s`, user.name, user.level)}" />

<!-- 调用静态方法 -->
<TextView
    android:text="@{DateUtil.format(order.createTime, `yyyy-MM-dd`)}" />

5.3 调用对象方法

xml
<!-- 调用对象实例方法 -->
<TextView
    android:text="@{user.getDisplayName()}" />

<!-- 链式调用 -->
<TextView
    android:text="@{order.getItems().get(0).getName()}" />

<!-- 方法结果作为参数 -->
<TextView
    android:text="@{formatMoney(calculateTotal(cart.items))}" />

5.4 Lambda 表达式支持

DataBinding 不直接支持 Lambda,但可以通过 ClickListener 包装:

xml
<!-- 点击事件传递参数 -->
<Button
    android:onClick="@{() -> viewModel.onItemClicked(item.id)}" />

<!-- 使用接口 -->
<Button
    android:onClick="@{viewModel::deleteItem}" />

5.5 常用方法示例

xml
<!-- 格式化方法 -->
<TextView
    android:text="@{DateUtil.format(time, `yyyy-MM-dd HH:mm`)}" />

<TextView
    android:text="@{NumberUtil.formatMoney(amount)}" />

<TextView
    android:text="@{StringUtil.isEmpty(text) ? `空` : text}" />

<!-- 验证方法 -->
<TextView
    android:text="@{EmailUtil.isValid(email) ? `有效邮箱` : `无效邮箱`}" />

<TextView
    android:text="@{PhoneUtil.isValid(phone) ? `有效手机` : `无效手机`}" />

5.6 自定义方法调用

kotlin
// 定义静态工具类
object BindingUtils {
    @JvmStatic
    fun formatDate(timestamp: Long): String {
        return SimpleDateFormat("yyyy-MM-dd").format(Date(timestamp))
    }
    
    @JvmStatic
    fun formatMoney(amount: Double): String {
        return String.format("¥%.2f", amount)
    }
}
xml
<!-- XML 中调用 -->
<TextView
    android:text="@{BindingUtils.formatDate(order.createdAt)}" />

<TextView
    android:text="@{BindingUtils.formatMoney(product.price)}" />

六、字符串操作

6.1 字符串拼接

使用 + 号拼接

xml
<!-- 基本拼接 -->
<TextView
    android:text="@{user.firstName + ` ` + user.lastName}" />

<!-- 与变量拼接 -->
<TextView
    android:text="@{`欢迎,` + user.name + `!`}" />

<!-- 数值拼接 -->
<TextView
    android:text="@{`总价:¥` + cart.totalPrice}" />

字符串模板

xml
<!-- 反引号包裹的字符串 -->
<TextView
    android:text="@{`用户 ${user.name} 的等级是 ${user.level}`}" />

<!-- 多个变量 -->
<TextView
    android:text="@{`${user.name} (${user.age}岁) - ${user.city}`}" />

<!-- 表达式在模板中 -->
<TextView
    android:text="@{`余额:¥${account.balance}`}" />

6.2 字符串方法调用

xml
<!-- toUpperCase() -->
<TextView
    android:text="@{user.name.toUpperCase()}" />

<!-- toLowerCase() -->
<TextView
    android:text="@{user.email.toLowerCase()}" />

<!-- substring() -->
<TextView
    android:text="@{user.phone.substring(0, 3) + `****` + user.phone.substring(7)}" />

<!-- trim() -->
<TextView
    android:text="@{user.input.trim()}" />

6.3 字符串比较

xml
<!-- equals() -->
<TextView
    android:visibility="@{user.role.equals(`admin`) ? View.VISIBLE : View.GONE}" />

<!-- equalsIgnoreCase() -->
<TextView
    android:visibility="@{user.gender.equalsIgnoreCase(`male`) ? View.VISIBLE : View.GONE}" />

<!-- contains() -->
<TextView
    android:text="@{user.bio.contains(`热爱`) ? `积极用户` : `普通用户`}" />

6.4 字符串格式化工具

xml
<!-- String.format() -->
<TextView
    android:text="@{String.format(`%s 的年龄是%d岁`, user.name, user.age)}" />

<TextView
    android:text="@{String.format(`%.2f`, product.price)}" />

<!-- 多个格式占位符 -->
<TextView
    android:text="@{String.format(`[%s] %s: %s`, user.role, user.name, user.title)}" />

6.5 空字符串处理

xml
<!-- 空字符串判断 -->
<TextView
    android:text="@{user.name == `` ? `未命名` : user.name}" />

<!-- 结合空值合并 -->
<TextView
    android:text="@{user.name != null && user.name != `` ? user.name : `匿名用户`}" />

<!-- TextUtils 工具 -->
<TextView
    android:text="@{TextUtils.isEmpty(user.name) ? `未设置` : user.name}" />

七、数学运算

7.1 基本运算

xml
<!-- 加法 -->
<TextView
    android:text="@{cart.subtotal + cart.tax + ` 元`}" />

<!-- 减法 -->
<TextView
    android:text="@{product.originalPrice - product.discountPrice + ` 元优惠`}" />

<!-- 乘法 -->
<TextView
    android:text="@{item.price * item.quantity + ` 元`}" />

<!-- 除法 -->
<TextView
    android:text="@{totalScore / studentCount + ` 平均分`}" />

7.2 运算优先级

xml
<!-- 括号控制优先级 -->
<TextView
    android:text="@{(price + tax) * quantity}" />

<!-- 复杂表达式 -->
<TextView
    android:text="@{(order.subtotal * (1 - order.discountRate)) + order.shippingFee}" />

7.3 数值格式化

xml
<!-- String.format 格式化 -->
<TextView
    android:text="@{String.format(`%.2f`, score / total * 100) + `%`}" />

<!-- 百分比计算 -->
<TextView
    android:text="@{String.format(`%.1f`, completedTasks / totalTasks * 100) + `%`}" />

<!-- 科学计数法 -->
<TextView
    android:text="@{String.format(`%.2e`, largeNumber)}" />

7.4 数学函数

xml
<!-- Math.abs() -->
<TextView
    android:text="@{Math.abs(balance) + ` 元`}" />

<!-- Math.max() / Math.min() -->
<TextView
    android:text="@{Math.max(price1, price2) + ` 较高价`}" />

<TextView
    android:text="@{Math.min(score1, score2, score3) + ` 最低分`}" />

<!-- Math.round() -->
<TextView
    android:text="@{Math.round(rating) + ` 星`}" />

八、类型转换

8.1 自动类型转换

xml
<!-- 字符串转数值(自动) -->
<RatingBar
    android:rating="@{Double.parseDouble(ratingString)}" />

<!-- 数值转字符串(自动) -->
<TextView
    android:text="@{String.valueOf(user.age)}" />

8.2 显式类型转换

xml
<!-- Integer.parseInt() -->
<TextView
    android:text="@{Integer.parseInt(stringNumber) + 10}" />

<!-- Double.parseDouble() -->
<TextView
    android:text="@{Double.parseDouble(priceString) * 0.9}" />

<!-- Boolean.parseBoolean() -->
<View
    android:visibility="@{Boolean.parseBoolean(flagString) ? View.VISIBLE : View.GONE}" />

8.3 数值与字符串混合

xml
<!-- 自动转换 -->
<TextView
    android:text="@{age + 10}" />  <!-- age 如果是 String,会自动转换 -->

<!-- 字符串拼接中的数值 -->
<TextView
    android:text="@{`年龄:` + age}" />

九、常量与变量

9.1 使用常量

xml
<!-- 字符串常量(反引号) -->
<TextView
    android:text="@{`Hello World`}" />

<TextView
    android:text="@{user.role == `admin` ? `管理员` : `用户`}" />

<!-- 数值常量 -->
<TextView
    android:text="@{score > 60 ? `及格` : `不及格`}" />

<!-- 布尔常量 -->
<View
    android:visibility="@{true ? View.VISIBLE : View.GONE}" />

9.2 使用变量

xml
<!-- 数据变量 -->
<TextView
    android:text="@{user.name}" />

<!-- ViewModel 变量 -->
<TextView
    android:text="@{viewModel.title}" />

<!-- 局部变量(通过 data 标签定义) -->
<data>
    <variable name="item" type="com.example.Item" />
    <variable name="position" type="Integer" />
</data>

<TextView
    android:text="@{item.name + ` (#` + position + `)`}" />

9.3 静态常量引用

xml
<!-- 引用 R 常量 -->
<TextView
    android:text="@{R.string.app_name}" />

<TextView
    android:visibility="@{View.VISIBLE}" />

<!-- 自定义常量 -->
<TextView
    android:textSizeSp="@{Constants.FONT_SIZE_NORMAL}" />

十、表达式限制

10.1 不支持的操作

xml
<!-- ❌ 不支持循环 -->
<!-- <TextView android:text="@{for (item : items) item.name}" /> -->

<!-- ❌ 不支持定义局部变量 -->
<!-- <TextView android:text="@{int x = 10; x + 5}" /> -->

<!-- ❌ 不支持复杂的控制流 -->
<!-- <TextView android:text="@{if (condition) { ... } else { ... }}" /> -->

<!-- ❌ 不支持 throw/catch -->
<!-- <TextView android:text="@{try { ... } catch (e) { ... }}" /> -->

<!-- ❌ 不支持 new 关键字 -->
<!-- <TextView android:text="@{new User().name}" /> -->

10.2 支持的操作

xml
<!-- ✅ 支持算术运算 -->
<TextView android:text="@{a + b * c - d / e}" />

<!-- ✅ 支持逻辑运算 -->
<TextView android:text="@{(a &amp;&amp; b) || (!c)}" />

<!-- ✅ 支持三元运算符 -->
<TextView android:text="@{condition ? trueValue : falseValue}" />

<!-- ✅ 支持空值合并 -->
<TextView android:text="@{value ?: defaultValue}" />

<!-- ✅ 支持方法调用 -->
<TextView android:text="@{format(value)}" />

<!-- ✅ 支持集合访问 -->
<TextView android:text="@{items.get(0).name}" />

10.3 表达式长度限制

xml
<!-- 表达式不宜过长,建议拆分 -->

<!-- ❌ 不推荐:过长的表达式 -->
<TextView
    android:text="@{user.firstName != null && user.lastName != null && user.firstName.length() > 0 && user.lastName.length() > 0 ? user.firstName + ` ` + user.lastName : user.nickName != null && user.nickName.length() > 0 ? user.nickName : `匿名用户`}" />

<!-- ✅ 推荐:在 ViewModel 中处理 -->
<TextView
    android:text="@{user.displayName}" />
kotlin
// ViewModel 中处理复杂逻辑
val User.displayName: String
    get() {
        if (!firstName.isNullOrEmpty() && !lastName.isNullOrEmpty()) {
            return "$firstName $lastName"
        }
        return nickName ?: "匿名用户"
    }

十一、性能优化

11.1 避免复杂表达式

xml
<!-- ❌ 低效:复杂计算 -->
<TextView
    android:text="@{calculateComplexResult(a, b, c, d, e, f)}" />

<!-- ✅ 高效:预处理 -->
<TextView
    android:text="@{viewModel.preprocessedResult}" />

11.2 避免重复计算

xml
<!-- ❌ 低效:重复计算 -->
<TextView
    android:text="@{(a + b) * (a + b) * (a + b)}" />

<!-- ✅ 高效:ViewModel 中缓存 -->
<TextView
    android:text="@{viewModel.cachedResult}" />

11.3 合理使用表达式

xml
<!-- ✅ 简单表达式:推荐使用 -->
<TextView android:text="@{user.name}" />
<TextView android:text="@{a + b}" />
<TextView android:text="@{condition ? yes : no}" />

<!-- ⚠️ 复杂表达式:谨慎使用 -->
<TextView
    android:text="@{complexCondition ? complexCalculation(a, b, c) : anotherCalculation(d, e, f)}" />

十二、面试考点

12.1 基础概念

Q1: DataBinding 表达式语言的特点?

A:

  • 声明式语法
  • 类型安全
  • 支持运算符、条件、方法调用
  • 不支持循环和复杂控制流

Q2: 三元运算符的语法?

A:

xml
condition ? trueValue : falseValue

Q3: 空值合并运算符的语法?

A:

xml
value ?: defaultValue

12.2 进阶问题

Q4: 表达式中如何调用方法?

A:

xml
<TextView android:text="@{formatText(user.name)}" />
<TextView android:text="@{user.getDisplayName()}" />

Q5: 表达式中如何拼接字符串?

A:

xml
<!-- + 号拼接 -->
<TextView android:text="@{user.firstName + ` ` + user.lastName}" />

<!-- 反引号模板 -->
<TextView android:text="@{`欢迎 ${user.name}`}" />

Q6: 表达式中如何进行数值运算?

A:

xml
<TextView android:text="@{price * quantity}" />
<TextView android:text="@{(a + b) * c}" />
<TextView android:text="@{Math.max(a, b)}" />

12.3 场景题

Q7: 如何在表达式中实现日期格式化?

A:

xml
<!-- 调用工具方法 -->
<TextView android:text="@{DateUtil.format(createdAt, `yyyy-MM-dd`)}" />

<!-- 或者在 ViewModel 中预处理 -->
<TextView android:text="@{order.formattedDate}" />

Q8: 表达式中的性能问题如何解决?

A:

  1. 避免复杂表达式
  2. 在 ViewModel 中预处理
  3. 使用缓存
  4. 简化条件判断

12.4 手写代码

Q9: 实现一个显示用户等级的表达式

A:

xml
<TextView
    android:text="@{user.level == 1 ? `青铜` :
                  user.level == 2 ? `白银` :
                  user.level == 3 ? `黄金` :
                  user.level == 4 ? `铂金` :
                  user.level == 5 ? `钻石` :
                  `未知`}" />

Q10: 实现一个带默认值的用户显示名

A:

xml
<TextView
    android:text="@{user.realName ?: user.nickName ?: user.username ?: `匿名用户`}" />

十三、最佳实践

13.1 表达式复杂度控制

复杂度建议
简单(1-2 个操作)直接使用表达式
中等(3-5 个操作)考虑拆分
复杂(5+ 个操作)移到 ViewModel

13.2 可读性优先

xml
<!-- ✅ 清晰 -->
<TextView android:text="@{user.name}" />

<!-- ⚠️ 复杂但可读 -->
<TextView android:text="@{user.firstName + ` ` + user.lastName}" />

<!-- ❌ 难以维护 -->
<TextView
    android:text="@{a?b:c?d:e?f:g}" />

13.3 测试建议

kotlin
// 对复杂表达式编写单元测试
@Test
fun testDisplayName() {
    val user = User(firstName = "John", lastName = "Doe")
    assertEquals("John Doe", user.displayName)
}

十四、总结

14.1 核心语法

类型语法示例
三元运算符? :a > 0 ? yes : no
空值合并?:name ?: default
逻辑与&&a && b
逻辑或||a || b
逻辑非!!a
字符串拼接+a + b
方法调用()func(a)
集合访问.list.get(0)

14.2 使用建议

推荐:

  • 简单数据处理
  • 条件判断
  • 字符串拼接
  • 数值运算

避免:

  • 复杂业务逻辑
  • 网络请求
  • 数据库操作
  • 循环遍历

14.3 学习路径

  1. 掌握基本运算符
  2. 学会条件表达式
  3. 熟练方法调用
  4. 理解性能优化
  5. 实践最佳实践

本文档最后更新:2024 年

DataBinding 表达式语言让 XML 布局充满活力,合理使用可以大大简化代码!