Log.i(“MainViewModel”, “commonLog - onClick: 没有参数,或者有参数也行,但是 xml 中也必须给它传对应的值”)
}
其中双冒号 :: 绑定方法的签名必须和属性要求的对象方法签名一致。这里即 OnClickListener 的 onClick 方法。同样的,如果是 onLongClick 监听,那就要求你的方法有返回 Bool 值了。
第三种是表达式的写法,我们下面会说,学过 Java8 的都知道箭头 -> 和双冒号 :: 是 Lambda 表达式。
8. 支持表达式
DataBinding 支持部分表达式,还支持 Lambda 表达式,如上的点击事件,但是建议不要过于复杂,因为 DataBinding 不支持单元测试的,报错也不是很智能。支持的运算符和关键字如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9SxZNnCg-1651810470642)(https://upload-images.jianshu.io/ 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 upload_images/22796403-559b572d348a195f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
没有 this、super、new 和显式泛型调用。示例如下:
android:text=“@{String.valueOf(index + 1)}”
android:visibility=“@{age > 13 ? View.GONE : View.VISIBLE}”
android:transitionName=‘@{“image_” + id}’
android:transitionName=“@{
image_
+ id}”
String 是无需 import 的,因为是 java.lang 包下的,但是 View 就需要了,见上面的导入 import 说明。
如果需要内嵌字符串,那么需要用单引号包裹。或者使用 `` 符号包裹,如上。
(1) 双问号,三元运算符的简化
android:text=“@{user.displayName ?? user.lastName}”
displayName 不为 null,则使用 displayName,否则使用 lastName。
(2) 访问集合、数组等元素
跟访问数组一样,用 [] 括号访问,比如:
android:text=“@{list[index]}”
android:text=“@{map[key]}”
如果是 map 类型的,甚至可以这样:map.key,就跟访问属性一样。而且会自动强转,如果你的 value 不是字符类型的,DataBinding 会强转为符合 text 属性的类型。
(3) 访问资源
比如说 strings,dimens,color 等
android:padding=“@{large? @dimen/largePadding : @dimen/smallPadding}”
android:text=“@{@string/nameFormat(firstName, lastName)}”
android:text=“@{@plurals/banana(bananaCount)}”
如果是自定义的 View,比如有个 set 方法参数要求是 Drawable,而 xml 中无法配置 Drawable 对象,只能是 int 型的资源地址,那么就需要自定义转换器了,转换器下面说。
9. 避免空指针异常
如下绑定:
android:text=“@{String.valueOf(user.age)}”
如果 user 是空的,不会引发空指针异常,DataBinding 会根据变量的类型,自动设置默认值,比如 age 是 int,那么默认值是 0,不仅是字段,方法也一样。
10. 使用其他 View 的值
tv_msg 会自动生成 tvMsg 字段,因此可以直接调用相关方法。