BindingAdapter
的简单使用
首先回顾一下kotlin
中实现静态方法
-
通过伴生对象实现
这样当前类中所有的方法都可以直接类.方法名()调用
class ClassName{
//包裹你要调取的方法
companion object {
//带有参数及返回值的方法
fun staticFunName(context: Context): Int {
}
}
}
-
通过将
class
关键字修改为object
关键字这样当前类中所有的方法都可以直接 类.方法名() 调用
object StaticClassName{
//包裹你要调取的方法
companion object {
//带有参数及返回值的方法
fun staticFunName(context: Context): Int {
}
}
}
下面介绍BindingAdapter
的简单使用
-
创建一个
kotlin
文件,声明静态方法,两种实现形式,上方已经写明setImage
方法需要通过注解声明,并且是静态方法BindingAdapter:
注解中传入的字符串为xml
文件中View
组件要使用的命名空间的名称JvmStatic:
在BindingAdapter
中两种调用静态方法需要加上这个注解,不然会报错报错内容如下:
Companion is not static and requires an object to use, retrieved from the DataBindingComponent.
BindingAdapter
在代码中静态方法的实现class SecondViewModel { companion object { @BindingAdapter("image_namespace") @JvmStatic fun setImage(view: ImageView, url: String) { Log.i("tag", "url---->>" + url) } } }
-
xml
里在data
标签中定义String
类型的参数url_image
将
url_image
参数传入app:image_namespace="@{url_image}"
image_namespace
为上面方法注解中的定义的字符串
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:bind="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="url_image"
type="String" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
app:image_namespace="@{url_image}" />
</LinearLayout>
</layout>
-
最后在
Activity
文件需要实现的代码上面的
setImage
方法会进行回调,指定kotlin
代码
var databind: ActivityMainBinding= DataBindingUtil.setContentView(this, R.layout.activity_main)
//调用xml文件中声明的url_image参数,并且赋值
databind.url_image = "http://www.baidu.com"
多参数的使用
xml
中的实现
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
app:image1="@{url_image}"
app:image2="@{size_image}" />
- 代码中实现
@BindingAdapter(value = ["image1", "image2"], requireAll = false)
@JvmStatic
fun setImage(view: ImageView, url: String, size: Int) {
Log.i("tag", url + ">>>" + size)
}
这里 requireAll = false
表示我们可以使用这两个两个属性中的任一个或同时使用,如果requireAll = true
则两个属性必须同时使用,不然报错。默认为 true。
参考内容:
https://developer.android.com/topic/libraries/data-binding#java
需要完善的内容:
可选旧值的功能