Data Binding 下

作者: crossroads | 来源:发表于2019-07-26 15:49 被阅读1次

    一、前言

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

    后记

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

    相关文章

      网友评论

        本文标题:Data Binding 下

        本文链接:https://www.haomeiwen.com/subject/oyvalctx.html