上一篇中我们介绍了 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类中使用了两种动态绑定方法
- 使用
@bindable
注解, 在属性的 get 方法上进行注解, 编译之后, 会在BR
文件中生成对应的变量 id, 如上为BR.showFlag
, 当我们绑定的 testBean 对象中的 showFlag 产生变化时, 布局显示会自动根据绑定的实际值去刷新 view, 相当智能, 省去了很多 activity中无用的成员变量, 以及后期的找 view 设置值. - 使用
ObservableField<>
定义属性, 这样写相当于不需要再写get
和set
的两个对应方法, 同样可以达到动态绑定数据的效果.
在 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布局中, 在设置一些值或者变量的时候, 可能需要使用转义字符,否则没有办法编译通过, 常见的转义字符包括:
显示结果 | 描述 | 转义字符 | 十进制 |
---|---|---|---|
空格 |  ; |  ; | |
< | 小于号 | <; | <; |
> | 大于号 | >; | >; |
& | 与号 | &; | &; |
" | 引号 | "; | "; |
‘ | 撇号 | &apos; | '; |
× | 乘号 | ×; | ×; |
÷ | 除号 | ÷; | ÷; |
事件处理
我们经常需要处理一些 view 的点击事件, 通常我们的方法是setOnClickListener()
, 或者通过ButterNife
第三方绑定点击事件, 引入 dataBinding 后, 有两种方法去设置点击事件:
- 通过
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" />
网友评论