本文为菜鸟学习笔记兼翻译练习用,翻译可能会不准确,细节请以原文为准,如有不足之处还请见谅,若能斧正,小弟不胜感激。原文地址:Google Data Binding Library
语法和运算符
(和Java的)通用特性(Common Features)
下边的语法和运算符和Java基本相同:
- 基本数学运算符(Mathematical):+ - / * %
- 字符串拼接(String concatenation):+
- 逻辑运算符(Logical):&& ||
- 位运算符(Binary):& | ^
- 一元运算符(Unary):+ - ! ~
- 移位运算符(Shift):>> >>> <<
- 比较运算符(Comparison):== > < >= <=
- 关键字instanceof
- 括号运算符(Grouping):()
- 字符(Literals):character,String,numeric,null
- 强制转换(Cast)
- 方法调用(Method calls)
- 字段访问(Field access)
- 数组访问(Array access[])
- 三元运算符(Ternary operator):?
举个栗子:
android:text="@{String.valueOf(index + 1)}"
android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"
android:transitionName='@{"image_" + id}'
不支持的关键字操作
下列Java中的关键字操作是不支持的:
- this
- super
- new
- 通用的显式调用(Explicit generic invocation)
空引用合并(Null Coalescing Operator)
空引用合并运算符(??),当左边的值不为空,取左边的值;左边的值为空时取右边的值。
android:text="@{user.displayName ?? user.lastName}"
在功能上这段等同于:
android:text="@{user.displayName != null ? user.displayName : user.lastName}"
属性引用
在第一篇第一个数据绑定表达式中,我们已经讨论过:简式的JavaBean引用。当一个表达式引用一个类的属性时,它使用相同格式的字段,getter,和可观察的字段(ObservableFiedlds)。
android:text="@{user.lastName}"
避免空指针
自动创建的数据绑定代码会检查空指针和避免空指针错误。例如, 在表达式@{user.name}中,如果user为空,user.name会分配其默认值(null)。如果你使用user.age, 如果age字段是int型, 则这里获得的值是默认值0。
集合
通用的集合有:arrays,lists,sparse lists和maps,可以通过[]运算符便利的访问:
<data>
<import type="android.util.SparseArray"/>
<import type="java.util.Map"/>
<import type="java.util.List"/>
<variable name="list" type="List<String>"/>
<variable name="sparse" type="SparseArray<String>"/>
<variable name="map" type="Map<String, String>"/>
<variable name="index" type="int"/>
<variable name="key" type="String"/>
</data>
…
android:text="@{list[index]}"
…
android:text="@{sparse[index]}"
…
android:text="@{map[key]}"
字符串常量
如果使用单引号,使用双引号在表达式中更显便利:
android:text='@{map["firstName"]}'
也可以用双引号环绕属性值。当这样做时,字符串常量使用" ' "或" ` ":
android:text="@{map[`firstName`}"
android:text="@{map['firstName']}"
资源访问
使用通用的语法也可以将资源文件作为表达式的一部分:
android:padding="@{large? @dimen/largePadding : @dimen/smallPadding}"
格式字符串和复数也可以通过提供参数估值:
android:text="@{@string/nameFormat(firstName, lastName)}"
android:text="@{@plurals/banana(bananaCount)}"
当一个复数携带多个参数时,所有的参数都要传递:
Have an orange
Have %d oranges
android:text="@{@plurals/orange(orangeCount, orangeCount)}"
一些资源需要显示类型估值:
Type | Normal Reference | Expression Reference |
String[] | @array | @stringArray |
int[] | @array | @intArray |
TypedArray | @array | @typedArray |
Animator | @animator | @animator |
StateListAnimator | @animator | @stateListAnimator |
color int
| @color | @color |
ColorStateList | @color | @colorStateList |
这一片内容比较多,下一篇从Data Objects开始翻译。