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

浙公网安备 33010602011771号