Data Binding,View基本属性赋值

来源:互联网 发布:php web 文件上传 编辑:程序博客网 时间:2024/05/22 00:11

android中引入Data Binding已经两年了。终于可以告别findViewById()butterknife了。怎样配置初步使用有很多资料,下面主要介绍一些实际的应用场景,如何设置view一些基本属性以实现减少activity,fragment中减少逻辑代码。

优点:

  • 去掉大部分UI相关代码(比如findViewByIdsetOnClickListenersetText等),使activity,fragment代码更加简洁。
  • xml变成UI的唯一真实来源,数据绑定也直接发生在xml,不会在出现UI子线程中操作的问题了
  • 实现view 基本属性设置在XML布局文件中完成。view中常见的动态属性:(android:textandroid:textColorandroid:backgroundandroid:visibilityandroid:onClick(ImageView)android:src)

需要注意的坑:

  • 无法定位错误。(复制拷贝layout文件属性值配置出错)这是一个让人崩溃的问题,特别是初次使用,一旦出错所有使用databindingxml都跳出来。
  • 无法定位错误。(window环境可能因为环境变量未配置,字符串编译默认类型不是UTF-8,编译出错)
  • RecycleView 中使用
  • item中图片等绑定
  • 子View中数据传递


text赋值

//直接赋值

android:text="@{userInfo.nickName}"

//注意赋值时最好使用string.xml中引用值,直接赋值windows环境中可能会编译不过,造成全部databinding布局文件出错。需要在windows环境中配置环境变量,

JAVA_TOOL_OPTIONS,-Dfile.encoding=UTF-8

android:text="@{userInfo.status ? `已关注` : `关注`}"

android:text="@{userInfo.status ?@string/value1 :@string/value2}"

//string.xml中字符串组合

android:text="@{@string/product_value(holdValue)}"


//有逻辑判断的赋值,为null时设置默认值。注意此处外层为单引号,内层为双引号,于其他赋值刚好相反,并非写错了。

android:text='@{userInfo.nickName  ?? "7"}'  or 

android:text='@{userInfo.nickName != null ? userInfo.nickName : "Default Name"}'


//数值型判断

android:text="@{publishNum  == 0 ? null : String.valueOf(publishNum) }"



//boolean类型:逻辑判断,

android:padding="@{isBig ? @dimen/bigPadding : @dimen/smallPadding}"


//int型逻辑判断:

android:visibility="@{waitingView  == 0 ? View.VISIBLE : View.GONE }" 


//int型逻辑判断:大于或小于某值,&lt;表示<  ,&gt;表示>

//此处表示小于3时的逻辑判断

android:visibility="@{waitingView  &lt; 3 ? View.VISIBLE : View.GONE }"



//3种分支的逻辑判断,根据参照值等于,小于,大于设置对应背景色

//int flag = d != 4 ? (d > 4 ? 9 : 1) : 8;

android:background="@{rightsInfo.curPrice  == rightsInfo.openPrice ? @color/gray : (rightsInfo.curPrice  &lt; rightsInfo.openPrice ? @color/chart_green : @color/chart_red) }"



单击事件databinding实现

1.定义单件事件接口

/**

 * 用于dataBinding点击事件接收

 */

public interface ClickCallback {

    void onClick(View view);

}


2.布局文件中引用单件接口

<variable

    name="clickCallback"

    type="com.XX.XX…ClickCallback" />


3.表示将view自身传递,通过viewID判断是否触发该view的点击事件。

<TextView
    android:id="@+id/txtFocusStatus"
    android:layout_width="80dp"
    android:layout_height="30dp"
    android:background="@{userInfo.status ? @drawable/btn_default_style1 : @drawable/btn_default_style2}"
    android:gravity="center"
    android:onClick="@{() ->  callback.onClick(txtFocusStatus)}"
    android:text="@{userInfo.status ? `
已关注` : `关注`}"
    android:textColor="@{userInfo.status ? @color/black : @color/default_style_color0}"
    android:textSize="@dimen/font_text_content"
/>


4.接口实现

public final ClickCallback mClickCallback = new ClickCallback() {

    @Override

    public void onClick(View view) {

        switch (view.getId()) {

            case txtFocusStatus: {

               //触发该控件单击事件

            }

            break;

    }

};




//向子布局文件传递定义的对象

<include
    android:id="@+id/waiting"
    layout="@layout/waiting_view"
    app:clickCallback="@{ clickCallback }"
    app:waitingView="@{ waitingView }"
/>





原创粉丝点击