Databinding 使用二

2018-02-12  本文已影响7人  走在冷风中吧

上一篇中我们介绍了 databinding 的简单使用, 简单绑定view, 以及加载显示静态的数据, 但是实际在使用的过程中, 我们可能需要动态的改变一些 view 的值, databinding 帮我们很轻松的实现了这个功能~~


我们需要改变的就是实体 bean 类, 让实体类继承BaseObservable,

public class TestBean extends BaseObservable {

    public final ObservableField<String> userName = new ObservableField<>();
    Boolean showFlag = true;

    @Bindable
    public Boolean getShowFlag() {
        return showFlag;
    }

    public void setShowFlag(Boolean showFlag) {
        this.showFlag = showFlag;
        notifyPropertyChanged(BR.showFlag);
    }
}

以上bean类中使用了两种动态绑定方法

  1. 使用@bindable注解, 在属性的 get 方法上进行注解, 编译之后, 会在BR文件中生成对应的变量 id, 如上为 BR.showFlag, 当我们绑定的 testBean 对象中的 showFlag 产生变化时, 布局显示会自动根据绑定的实际值去刷新 view, 相当智能, 省去了很多 activity中无用的成员变量, 以及后期的找 view 设置值.
  2. 使用 ObservableField<>定义属性, 这样写相当于不需要再写 getset 的两个对应方法, 同样可以达到动态绑定数据的效果.

在 bean 中进行动态属性的绑定后, 我们在 xml 中可以自由自在的使用需要的属性了~

关于xml中引用表达式

xml 支持大多数的 java 表达式:

android:text="@{String.valueOf(age)}"
android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"
android:text='@{"iname:" +user.name}'

除了户外还支持 null 合并操作, 就很牛逼了~

android:text="@{user.displayName ?? user.lastName}"
//等价于
android:text="@{user.displayName != null ? user.displayName : user.lastName}"

相比较 java 代码不支持的是:
• this
• super
• new
• 显式泛型调用 <T>


在 xml布局中, 在设置一些值或者变量的时候, 可能需要使用转义字符,否则没有办法编译通过, 常见的转义字符包括:

显示结果 描述 转义字符 十进制
空格 &nbsp; &#160;
< 小于号 &lt; &#60;
> 大于号 &gt; &#62;
& 与号 &amp; &#38;
" 引号 &quot; &#34;
撇号 &apos; &#39;
× 乘号 &times; &#215;
÷ 除号 &divide; &#247;

事件处理

我们经常需要处理一些 view 的点击事件, 通常我们的方法是setOnClickListener(), 或者通过ButterNife第三方绑定点击事件, 引入 dataBinding 后, 有两种方法去设置点击事件:

  1. 通过activity绑定到 onclick 事件
    <data>

        <variable
            name="activity"
            type="com.example.databinding.MainActivity" />

    </data>

            <TextView
                android:id="@+id/tv_dis"
                android:layout_width="match_parent"
                android:layout_height="60dp"
                android:layout_gravity="center"
                android:background="@color/colorAccent"
                android:gravity="center"
                android:onClick="@{v -> activity.onClick(v)}"
                android:text="点击隐藏/显示include" />
上一篇下一篇

猜你喜欢

热点阅读