参考:
Data Binding Library
Data Binding指南
上面两篇博客写的非常详细了,这里我只是记录自己的问题。
自定义Setter:
用这个绑定ImageView感觉特别棒。
// 自定义加载图片到ImageView
@BindingAdapter({"url","error"})
public static void loadImage(ImageView view, String url, Drawable error){
Glide.with(view.getContext()).load(url).into(view);
}
注意点:这里error传入的是Drawable对象
<!-- 布局文件 -->
<ImageView
app:url=“@{model.imageUrl}”
app:error=“@{@drawable/error}”/>
如上类似加载图片的方法,其他常用的方法也可以自定义出来,方便使用。
有时候事件绑定不方便,会利用自定义的方式实现:
@BindingAdapter({"navigationOnClick"})
public static void setNavigationOnClick(Toolbar toolbar, View.OnClickListener clickListener){
toolbar.setNavigationOnClickListener(clickListener);
}
//ViewModel中的方法
public View.OnClickListener getOnClick() {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
...
}
};
}
<!-- 布局文件 -->
<android.support.v7.widget.Toolbar
app:navigationOnClick="@{model.onClick}"/>
遇见的Bug:
当在Activity中创建的Binding,所获取的控件id为null
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
//R.layout.main_activity内有TextView,且设置了id="text_view"
binding.textView
}
不知道为何,这里的binding.textView 为null,找不到这个控件。
其他,在 fragment或者 adapter 中使用 binding不会出现这个问题。
表达式语音:
这里记录几个常用的表达式语言
- 数学计算 + - / * %
- 字符串连接 +
- 类型转换
- 三元运算符 ?:
- 逻辑 && ||
- Null合并运算符
// int类型转换成String类型,可以直接调用String
// int类型可以进行数学计算
android:text="@{String.valueOf(index + 1)}"
// 三元运算符 ?:
// 这里可以直接调用View
android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"
// 字符串相加
android:transitionName='@{"image_" + id}'
//Null合并运算符(??)会在非 null 的时候选择左边的操作,反之选择右边。
android:text="@{user.displayName ?? user.lastName}"
网友评论