谷歌的databinding非常好用,但是前提你得熟悉各种用法,否则坑很多,很容易从入门到放弃。
后来在实际开发中,碰到很多问题,经过自己的探索和修改,逐渐提升了对databinding的熟练度,下面我会额外讲解其常见用法
强烈建议封装在自己的ViewModel中再使用,既方便管理,也符合规范
1.常见的TextView的文字加载非常简单
如果需要直接拼接一些文字,则需要特殊的单引号
android:text="@{bean.text}"
android:text="@{bean.text+ `元`}"
2.图片加载
图片加载需要使用一个特殊的注解BindingAdapter
详细用法请参考
Databinding中ImageView的用法和坑(Java和Kotlin),附带Glide用法
public class BaseViewModel {
@BindingAdapter({"app:imgRes"})
public static void setImageView(ImageView imageView, int res) {
imageView.setImageResource(res);
}
@BindingAdapter({"app:imgUrl"})
public static void setImageView(ImageView imageView, String url) {
if(TextUtils.isEmpty(url)){
return;
}
Glide.with(imageView.getContext()).load(url).into(imageView);
}
public int switchStatusImage() {
int imgRes = 0;
switch (需要判断的值) {
case 0:
imgRes = R.drawable.icon_******;
break;
case 1:
imgRes = R.drawable.icon_******;
break;
case 3:
imgRes = R.drawable.icon_******;
break;
default:
break;
}
return imgRes;
}
}
其中viewModel.switchStatusImage() 只是封装而已,其实就是一个图片地址的引用
app:imgRes="@{viewModel.switchStatusImage()}"
3.visibility
有时候有一些控件需要在特定的条件下隐藏或者显示,那该怎么办呢?
注意,如果不进行ViewModel的封装,而是直接使用,需要在xml当中导包
<import type="android.text.TextUtils"/>
<import type="android.view.View"/>
****
*****
****
android:visibility="@{TextUtils.isEmpty(bean.status) ? View.VISIBLE : View.GONE}"
4.颜色 textColor
<import type="android.text.TextUtils"/>
<import type="androidx.core.content.ContextCompat"/>
<import type="com.你自己项目的包名.R"/>
****
****
****
android:textColor="@{TextUtils.isEmpty(bean.status) ? ContextCompat.getColor(context,R.color.green_61A71F):ContextCompat.getColor(context,R.color.black_333333)}"
5.特殊字符
databinding 如果在设置text属性时,一些特殊字符是无法直接使用的,在编译的时候回报错,比如空格、“|”等等
这个时候需要使用string的引用来完成
android:text="@{bean.house_type +@string/separator+ bean.space +`m²`}"
不过后来实际开发发现,空格的引用也是无效的,如果封装在ViewModel中使用则跟普通的text一样
比如
public String description() {
return " | " + mRoomsBean.getSpace() + "m²";
}
***
***
***
android:text="@{viewModel.description()}"
6.点击事件
/**
* 跳转到拨号界面,同时传递电话号码
*/
public void skipToCallActivity(Context context, String phoneNumber) {
Intent dialIntent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + phoneNumber));
context.startActivity(dialIntent);
}
***
***
***
android:onClick="@{() -> viewModel.skipToCallActivity(context,bean.phone)}"
ps:如果封装成ViewModel,则需要额外导包
注意,所有的方法都是public 才能使用
<data>
<variable
name="bean"
type="com.*******.Bean"/>
<variable
name="viewModel"
type="com.*******.ViewModel"/>
</data>
binding.setBean(bean);
binding.setViewModel(new ViewModel(bean));