02.BindingAdapter

@BindingAdapter

  • 作用于方法
  • 它定义了xml的属性赋值的java实现
  • 方法必须为公共静(public static)方法,可以有一到多个参数。

问题
在使用databinding的时候,有时候发现:

1. 属性在类中没有对应的setter,如ImageView的android:src,ImageView中没有setSrc()方法,
2. 属性在类中有setter,但是接收的参数不是自己想要的,如android:background属性,对应的setter是setBackgound(drawable),但是我想传一个int类型的id进去,这时候android:background = “@{imageId}”就不行。
3. 没有对应的属性,但是却要实现相应的功能。

这时候可以使用@BindingAdapter来定义方法,解决上面的问题。

 

@BindingAdapter的格式为:

单个参数

@BindingAdapter({"attribute_name"})  
public static void method(View view,Type type){  
    //TO DO:一些view的操作
    …… 
} 

多个参数

@BindingAdapter({"attribute_name1","attribute_name2","attribute_name3",……})  
public static void method(View view,Type type1,Type type2,Type type3,……){  
    //TO DO:一些view的操作
    …… 
}

或者

@BindingAdapter(value = {"attribute_name1","attribute_name2","attribute_name3",……},requireAll = false)  
public static void method(View view,Type type1,Type type2,Type type3,……){  
    //TO DO:一些view的操作
    …… 
}

 

 

现在我们写一个小例子,在网络图片能获取的时候加载网络图片,在网络图片不能获取的时候加载本地图片

分为****************************************************************单个参数和多个参数***************************************************************************************

 

 

Picasso解析图片
implementation 'com.squareup.picasso:picasso:2.71828'

清单:读取网络图片权限
<uses-permission android:name="android.permission.INTERNET"/>

 

ImageViewBindingAdapter.class

public class ImageViewBindingAdapter {

    //单个参数
    @BindingAdapter("fuckNet")
    public static void setImage(ImageView imageView,String imageUrl){
        if (imageUrl != null){
            //解析图片   有时候网没过来,显示的图就是placeholder
            Picasso.get()
                    .load(imageUrl)
                    .placeholder(R.drawable.ic_baseline_ac_unit_24)
                    .into(imageView);
        }else {
            Toast.makeText(imageView.getContext(), "获取不到网络图片", Toast.LENGTH_SHORT).show();
        }
    }

    //多个参数
    @BindingAdapter(value = {"fuckNet","fuckLocal"},requireAll = false)
    public static void setImage(ImageView imageView,String imageUrl,int resId){
        if (imageUrl != null){
            //解析图片
            Picasso.get()
                    .load(imageUrl)
                    .placeholder(R.drawable.ic_baseline_ac_unit_24)
                    .into(imageView);
        }else {
            imageView.setImageResource(resId);
            Toast.makeText(imageView.getContext(), "获取不到网络图片", Toast.LENGTH_SHORT).show();
        }
    }
}

activity_main.xml

 

<?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"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="fuckNetImage"
            type="String" />
        <variable
            name="fuckLocalImage"
            type="int" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <ImageView
            android:id="@+id/imageView"
            android:layout_width="364dp"
            android:layout_height="338dp"
            app:fuckNet="@{fuckNetImage}"
            app:fuckLocal="@{fuckLocalImage}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.659"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.498" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

 

MainActivity.class

 

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main);
        activityMainBinding.setFuckNetImage("https://cdn.sunofbeaches.com/images/ad/shop-ad.png");
        activityMainBinding.setFuckLocalImage(R.drawable.ic_baseline_ac_unit_25);
    }
}

 

posted @ 2021-11-29 13:21  涂妖教  阅读(604)  评论(0)    收藏  举报