DataBinding xml中的写法大全

816 阅读2分钟

1. 引用Drawable图片

android:background="@{data.is_operable?@drawable/btn_select_shape:@drawable/btn_full_select_shape}"

2. 引用 mipmap 里的图片

因其不能直接引用 mipmap 里的图片,所以需要先导入一些包,通过以下方式引用:

<import type="xxx.R" />
<import type="androidx.core.content.ContextCompat" />

android:src="@{data.size==0?ContextCompat.getDrawable(context, R.mipmap.order_before_pay):ContextCompat.getDrawable(context, R.mipmap.order_now_pay)}"

3. 可见和不可见

也是需要导入一个 View 的包,才可以,如下写法:

<import type="android.view.View" />
android:visibility="@{data.select?View.GONE:View.VISIBLE}"

4. 引入工具类

一般都是需要导入 工具类的包,假如我工具类中写一个对后端返回的名字需要脱敏,就可以这么写:

<import type="xxx.Utils" />
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个,占位符这种又该如何使用呢?

<string name="room_num">共%s个</string>
android:text="@{@string/room_num(orderBean.room_amount)}"

7. 设置TextView类型的按钮是否可点

我们有很大一部分场景是动态设置按钮是否可点,一个属性 android:enabled 加一个变量就可以了,数据变量值的控制逻辑可以交给ViewModel去处理,或者拿到数据后做进一步封装处理,例如:

<TextView
...
android:background="@{data.btnEnabled?@drawable/btn_select_shape:@drawable/btn_full_select_shape}"
    android:enabled="@{data.btnEnabled}"
    android:text="@{data.btnText}"
    ... />

8. 给ImageView 直接设置url 自动加载图片

通常我们就是想给 ImageView 设置一个url就可以加载网络图片,那么我们可以直接在xml 中定义相应的属性,放上我们的地址就可以了,于是我们的写法就变成了这样:

<TextView
...
<ImageView
    android:id="@+id/image"
    imageUrl="@{data.image_url}"
    ....省略一些属性
    android:scaleType="centerCrop" />

我们可以写一个扩展,写在项目中,任何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}"

汉字拼接:

<string name="user_name">name</string>
android:text="@{userBean.sex+@string/user_name}"

😂 还是需要定义 string , 推荐 6 中的写法。

10. 设置点击事件

例如我们要给一个按钮设置点击事件,点击之后做一些业务逻辑处理:

    <variable
        name="viewModel"
        type="xxxx.HomeViewModel" />

    <import type="android.view.View" />

    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);
}

持续更新,如果你发现更好的写法,可以在评论区分享出来~

更多绑定写法参考官方网站:

布局和绑定表达式