一、前言
最近使用Data Binding进行的APP开发,便写一个文档,方便大家零基础着手开发。因为项目中用的viewmodel+databinding,这里也只有这一种模式哦O(∩_∩)O~
二、双向绑定
这里用EditText举例~,来改变userName
<EditText
android:id="@+id/user_name_et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@={viewmodel.userName}"
/>
在viewmodel中:
val userName = MutableLiveData<String>().apply {
value = name
}
这样userName就和EditText互相绑定啦!和单向绑定多了个等号而已,十分方便
三、点击事件
user_name改变后,点击确定按钮提交
<TextView
android:id="@+id/confirm"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{()->viewmodel.changeName(viewmodel.userName)}"
android:text="confirm"
/>
在viewmodel中:
fun changeName(userName: String) {
}
这样点击confirm 的时候,就会调用viewmodel的changeName方法了
那如果我想调用一个接口的方法呢?和上边一样的,看
例如有这样一个接口
interface UserActionListener {
fun changeUserName(name:String)
}
那么xml中这样子
//在data中声明
<variable
name="listener"
type="com.XX.XX.UserActionListener" />
......
android:onClick="@{()->listener.changeUserName(viewmodel.userName)}"
......
当然最后不要忘记在activity或fragment中给 binding.listener赋值哦
四、网络imageView的加载
这时候我们就要借住BindingAdapter的力量了
object ViewBindings {
@BindingAdapter("imageUrl")
@JvmStatic
fun loadImage(view: ImageView, url: String) {
ImageLoader.get().load(view, url)
}
}
<ImageView
android:id="@+id/image"
android:layout_width="30dp"
android:layout_height="30dp"
android:scaleType="centerCrop"
app:imageUrl="@{url}"
/>
这样就OK啦
那如果我要给网络图片加一个radius呢?不想再写一个adapter怎么办?
@BindingAdapter(value = ["imageUrl", "radius"])
@JvmStatic
fun loadImage(view: ImageView, url: String, radius: Int) {
ImageLoader.get().load(view, url , radius)
}
<ImageView
android:id="@+id/image"
android:layout_width="30dp"
android:layout_height="30dp"
android:scaleType="centerCrop"
app:imageUrl="@{url}"
app:radius="@{6}" />
我们这里再思考一下,如果不用
android:visibility="@{safeUnbox(XX.isHide)? View.GONE:View.VISIBLE}"
方式来隐藏view,而是使用BindingAdapter怎么办呢?
@BindingAdapter("setVisibility")
fun setVisibility(view: View, isShow: Boolean) {
view.visibility = if (isShow) View.VISIBLE else View.GONE
}
//然后在xml中就可以啦
// app:setVisibility="@{false}"
后记
这里贴一下官网链接把,点击这里进入官网,
网友评论