1. 引用Drawable图片
android:background="@{data.is_operable?@drawable/btn_select_shape:@drawable/btn_full_select_shape}"
2. 引用 mipmap 里的图片
因其不能直接引用 mipmap
里的图片,所以需要先导入一些包,通过以下方式引用:
android:src="@{data.size==0?ContextCompat.getDrawable(context, R.mipmap.order_before_pay):ContextCompat.getDrawable(context, R.mipmap.order_now_pay)}"
3. 可见和不可见
也是需要导入一个 View
的包,才可以,如下写法:
android:visibility="@{data.select?View.GONE:View.VISIBLE}"
4. 引入工具类
一般都是需要导入 工具类的包,假如我工具类中写一个对后端返回的名字需要脱敏,就可以这么写:
android:text="@{Utils.removeNameInfo(data.name)}"
5. 字体颜色/字体大小
android:textColor="@{data.room_num==1?@color/color1:@color/color2}"
android:textSize="@{data.room_num==1?@dimen/sp_9:@dimen/sp_7}"
6. 格式化字符串
例如我们在 string
文件中定义的:共%s
个,占位符这种又该如何使用呢?
共%s个
android:text="@{@string/room_num(orderBean.room_amount)}"
7. 设置TextView类型的按钮是否可点
我们有很大一部分场景是动态设置按钮是否可点,一个属性 android:enabled
加一个变量就可以了,数据变量值的控制逻辑可以交给ViewModel
去处理,或者拿到数据后做进一步封装处理,例如:
8. 给ImageView 直接设置url 自动加载图片
通常我们就是想给 ImageView
设置一个url
就可以加载网络图片,那么我们可以直接在xml
中定义相应的属性,放上我们的地址就可以了,于是我们的写法就变成了这样:
我们可以写一个扩展,写在项目中,任何xml
中的 ImageView
都可以使用,如下:
public class DataBindingExtension {
private DataBindingExtension() {};
@BindingAdapter("imageUrl")
public static void loadImage(@NonNull ImageView view, @Nullable String url) {
if (url == null) {
LogUtils.w(TAG, "loadImage url is null");
return;
}
Glide.with(view)
.load(url)
.error(R.mipmap.default_empty_img)
.centerCrop()
.dontAnimate()
.into(view);
}
}
这样就可以啦~
9. 字符串拼接
其实如果不想把 文字写在 string
里,想直接在 xml
中 对服务器返回的数据做一些拼接,可以这么写,例如我想给服务器返回的价格字段拼接上一个 ‘¥’
符号,注意:这里只能拼接一些符号类,字母类的,如果是汉字会报错的:
android:text="@{data.isMember?'¥'+data.member_price:'¥'+data.price}"
汉字拼接:
name
android:text="@{userBean.sex+@string/user_name}"
还是需要定义 string
, 推荐 6 中的写法。
10. 设置点击事件
例如我们要给一个按钮设置点击事件,点击之后做一些业务逻辑处理:
android:onClick="@{viewModel.allDay()}"
然后我们就可以在 相应的 ViewModel
中,编写方法了,这里就是 HomeViewModel
中定义:
public View.OnClickListener allDay() {
return v -> {
//to do your work....
};
}
11. 动态设置宽/高
需要注意的是:必须要给一个默认值,因为一开始没值会报错
android:layout_width="@{data.fromType==1?@dimen/dp_197:@dimen/dp_155, default=@dimen/dp_155}"
需要我们扩展一个方法:
/**
* width
*
* @param view
* @param width
*/
@BindingAdapter("android:layout_width")
public static void setLayoutWidth(View view, float width) {
ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
layoutParams.width = (int) width;
view.setLayoutParams(layoutParams);
}
持续更新,如果你发现更好的写法,可以在评论区分享出来~
更多绑定写法参考官方网站:
布局和绑定表达式