Databinding相信开发过Android的人肯定不陌生,极大的简化了代码量,而且易于维护,不过中间的坑也是很多的,尤其是对于很多新手来说,如果用错了,简直可以用“一脸懵逼”来形容,因为databinding根本不会告诉你xml中的错误错在哪,不过studio3.4之后貌似有了错误的提示,比如哪个参数没找到之类的,不过还是没有像普通的代码一样能够直接提示到第几行。。。
TextView的用法很简单,只要把需要的String字符串传入就行,但是ImageView就不是这样了,用法有着很明显的不同。尤其是Kotlin和Databinding的结合,更是坑不少,下面我简单讲下Java和Kotlin中的ImageView和Databinding的用法:
一、Java:
@BindingAdapter({"app:imgUrl"})
public static void getTransImageView(ImageView imageView, int res) {
imageView.setImageResource(res);
}
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
app:imgUrl="@{bean.res}"
/>
1、如上面的代码这样,很简单,写一个静态方法,重点就是这个 @BindingAdapter 注解,ImageView本身无法直接在xml中使用android:src 属性来动态改变图片的属性,需要额外使用注解和对应的方法名称,其中app:imgUrl 这个是自定义的方法名称,也可以写成aa:imgUrl,或者aa:bb等等,但是千万不要写android:imgUrl !!!因为android是系统的方法,会报错,显示方法未找到!!!
2、里面的参数可以自定义,但是一定要有ImageView的参数,而且不需要传入任何ImageView对象,因为这个是本身
3、在xml中,直接使用刚刚自定义的方法app:imgUrl="@{bean.res}",大功告成
二、Kotlin
@BindingAdapter("app:imgUrl")
@JvmStatic
fun load(imageView: ImageView, res: Int) {
imageView.setImageResource(res);
}
1、Kotlin的注解略微不同,如果小伙伴照搬Java,就会报错,仔细观察,你会发现里面少了一个 {}
2、并且Kotlin使用静态方法,一定要额外加@JvmStatic 注解,因为Kotlin实际上是没有静态方法的,虽然Object类和companion object 方法美其名曰静态,但不是真实的静态,和java还是有区别的,只能叫做形式上的静态
3.xml中的使用和java一样,无区别
PS:如果小伙伴需要使用Glide结合Databinding怎么办呢?
直接获得view的context传入即可,Java也一样
@BindingAdapter("app:imgUrl")
@JvmStatic
fun load(view: ImageView, url: String) {
Glide.with(view.context).load(url).into(view)
}