DataBinding-BindingAdapter注解

@BindingAdapter自定义属性注解

dataBinding中自定义属性依赖于注解@BindingAdapter

  • 作用于方法,这个方法可以写在任何地方
  • 这个注解面向一个public static方法
  • {}内部表示使用时这个属性的名字。例如:@BindingAdapter({“imageUrl”}),imageUrl为属性的名称

简单应用-加载图片

public class ImageHelper {

    @BindingAdapter({"imageUrl"})
    public static void loadImage(ImageView imageView,String url){
        Glide.with(imageView.getContext())
                .load(url)
                .error(R.mipmap.ff)
                .placeholder(R.mipmap.ff)
                .into(imageView);

    }
  • 当ImageView中使用imageUrl属性时,会自动调用loadImage方法
  • url 图片地址
  • BindingAdapter也可以设置多个属性

布局:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

        <variable
            name="url"
            type="String" />

    </data>
    <LinearLayout
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >

        <ImageView
            android:layout_width="90dp"
            android:layout_height="90dp"
            android:scaleType="centerCrop"
            app:imageUrl="@{url}"/>

    </LinearLayout>
</layout>

  • 布局中使用imageUrl属性时,会自动调用会自动调用ImageHelper的loadImage方法
    MainActivity:
**public class MainActivity extends AppCompatActivity {

    private String Url = "https://c-ssl.duitang.com/uploads/item/201908/27/20190827152805_sfsxr.thumb.700_0.jpg";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);

        binding.setUrl(Url);
    }
}

BindingAdapter-多参数

图片的加载可能要使用错误图和占位图

public class ImageHelper {

    @BindingAdapter({"imageUrl","errorDrawableId","placeDrawableId"})
    public static void loadImage(ImageView imageView,String url,int errorDrawableId,int placeDrawableId ){
        Glide.with(imageView.getContext())
                .load(url)
                .error(errorDrawableId)
                .placeholder(placeDrawableId)
                .into(imageView);

    }
}
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

        <variable
            name="url"
            type="String" />
        <variable
            name="url2"
            type="int" />

    </data>
    <LinearLayout
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >

        <ImageView
            android:layout_width="90dp"
            android:layout_height="90dp"
            android:scaleType="centerCrop"
            app:imageUrl="@{url}"
            app:placeDrawableId="@{url2}"
            app:errorDrawableId="@{url2}"/>

    </LinearLayout>
</layout>

public class MainActivity extends AppCompatActivity {

    private String Url = "https://c-ssl.duitang.com/uploads/item/201908/27/20190827152805_sfsxr.thumb.700_0.jpg";

    private int url2 = R.mipmap.ff;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);

        binding.setUrl(Url);
        binding.setUrl2(url2);
    }
}

`@BindingAdapter` 是 Android Data Binding 框架中的一个重要注解,用于自定义视图绑定。当你直接使用 XML 布局文件时,数据绑定默认提供了基础的数据类型到视图属性的映射,如 `android:text`、`android:checked` 等。但有时候,你可能需要对原始数据进行一些转换或者处理,比如根据某个条件改变颜色,或者结合多个属性生成一个复合值等。 通过 `@BindingAdapter`,你可以创建一个方法,这个方法接收来自 Data Binding 的参数(通常是 View 和数据模型),然后执行你需要的逻辑,并返回一个或多个值,这些值会被用来设置视图的属性。这使得你在不扩展布局 XML 文件的情况下,能够增加更多的绑定规则,提升代码的复用性和可维护性。 例如,如果你有一个复杂的计算需要在 UI 展示上应用,你可以这样做: ```java @BindingAdapter({"myCustomColor", "text"}) public void bindCustomView(View view, String text, int myCustomColor) { // 进行颜色处理,比如根据文本判断是否加亮背景色 if (text.contains("important")) { view.setBackgroundColor(ContextCompat.getColor(view.getContext(), R.color.red)); } else { view.setBackgroundColor(myCustomColor); } } ``` 然后在 XML 中,你可以像绑定普通属性一样调用这个自定义的绑定: ```xml <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" app:myCustomColor="@color/default_color" app:text="@{viewModel.text}" app:bindCustomColor="@{viewModel.shouldHighlight ? @color/highlight_color : @{viewModel.myCustomColor}}"/> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值