Android 开发技术分享Android-Jetpack

Data Binding 下

2019-07-26  本文已影响1人  crossroads

一、前言

最近使用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}"

后记

这里贴一下官网链接把,点击这里进入官网,

上一篇下一篇

猜你喜欢

热点阅读