表达式
1 一般用法
表达式语言看起来很像托管代码中的表达式。您可以在表达式语言中使用以下运算符和关键字:
- 数学运算符 + - / * %
- 字符串连接符 +
- 逻辑运算法 && ||
- 位运算符 & | ^
- 一元运算符 + - ! ~
- 位移运算符 >> >>> <<
- 比较运算符 == > < >= <= (需要注意: < 需要编码为 <)
- instanceof
- 分组 ()
- 直接常量 - 字符, 字符串, 数字, null
- Cast
- 方法调用
- 属性访问
- 数组访问 []
- 三元运算符 ?:
示例:
android:text="@{String.valueOf(index + 1)}"
android:visibility="@{age > 13 ? View.GONE : View.VISIBLE}"
android:transitionName='@{"image_" + id}'
2 省略的操作
可以在托管代码中使用的表达式语法中省略一下操作:
- this
- super
- new
- Explicit generic invocation(显式泛型调用)
3 空合并运算符
如果左操作数不是null,则null合并运算符(??)选择左操作数;如果前者为null,则选择右操作数。
android:text="@{user.displayName ?? user.lastName}"
这在功能上等同于:
android:text="@{user.displayName != null ? user.displayName : user.lastName}"
4 属性引用
表达式可以使用以下格式引用类中的属性,这与字段、getter和ObservableField对象的格式相同:
android:text="@{user.lastName}"
5 避免空指针异常
生成的DataBinding代码会自动检查空值并避免出现空指针异常。例如,在表达式@{user.name}中,如果user为null,则为user.name指定其默认值null。如果引用user.age,其中age的类型为int,则数据绑定使用默认值0。
6 View引用
表达式可以使用以下语法按ID引用布局中的其他View:
android:text="@{exampleText.text}"
注意:绑定类将ID转换为驼峰大小写。
在以下示例中,TextView引用同一布局中的EditText:
<EditText
android:id="@+id/example_text"
android:layout_height="wrap_content"
android:layout_width="match_parent"/>
<TextView
android:id="@+id/example_output"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{exampleText.text}"/>
7 集合运算
为了方便起见,可以使用[]运算符访问常见集合,如数组、列表、稀疏列表和Map。
<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]}"
注意:为了使XML在语法上正确,您必须转义<字符。例如:您必须将List<String>编写为List<String>。
您还可以使用object.key表示法引用Map中的值。例如,上面示例中的@{map[key]}可以替换为@{map.key}。
8 字符串字面量
可以使用单引号将属性值括起来,这样可以在表达式中使用双引号,如以下示例所示:
android:text='@{map["firstName"]}'
也可以使用双引号将属性值括起来。执行此操作时,字符串文字应该用后引号(`) 括起来`:
android:text="@{map[`firstName`]}"
9 引用资源
表达式可以使用以下语法引用应用程序资源:
android:padding="@{large? @dimen/largePadding : @dimen/smallPadding}"
您可以通过提供以下参数来计算格式字符串和复数:
android:text="@{@string/nameFormat(firstName, lastName)}"
android:text="@{@plurals/banana(bananaCount)}"
可以将属性引用和视图引用作为资源参数传递:
android:text="@{@string/example_resource(user.lastName, exampleText.text)}"
当复数包含多个参数时,必须传递所有参数:
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 |
网友评论