DataBinding
数据绑定库是一种支持库,借助该库,您可以使用声明性格式(而非程序化地)将布局中的界面组件绑定到应用中的数据源。
案例一
Activity
// 步骤一:在 build.gradle 中添加 dataBinding { enabled = true }
// 步骤二:创建实体类,并在布局文件中引用它
public class OneDataActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 步骤三:使用 DataBindingUtil 加载布局,初始化实体类,并将实体类的值传到布局中
ActivityDoneBinding viewDataBinding = DataBindingUtil.setContentView(this, R.layout.activity_done);
Idol idol = new Idol("jetpack", 5);
viewDataBinding.setIdol(idol);
viewDataBinding.setEventHandler(new EventHandleListener(this));
}
}
实体类
public class Idol {
private String name;
private int star;
public Idol(String name, int star) {
this.name = name;
this.star = star;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getStar() {
return star;
}
public void setStar(int star) {
this.star = star;
}
}
EventHandleListener
public class EventHandleListener {
private Context context;
public EventHandleListener(Context context) {
this.context = context;
}
public void onClick(View view) {
Toast.makeText(context, "喜欢", Toast.LENGTH_SHORT).show();
}
}
Util
public class StarUtil {
public static String convert(int number) {
if (number < 1) {
return "一星";
} else if (number == 2) {
return "二星";
} else if (number == 3) {
return "三星";
} else if (number == 4) {
return "四星";
} else {
return "五星";
}
}
}
布局文件
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="idol"
type="com.zc.mydemo.jetpack.databind.Idol" />
<variable
name="eventHandler"
type="com.zc.mydemo.jetpack.databind.demo1.EventHandleListener" />
<import type="com.zc.mydemo.jetpack.databind.StarUtil" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
tools:context=".jetpack.databind.demo1.OneDataActivity">
<ImageView
android:id="@+id/image"
android:layout_width="300dp"
android:layout_height="300dp"
android:layout_marginTop="20dp" />
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="@{idol.name}"
android:textSize="20sp" />
<TextView
android:id="@+id/star"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="@{StarUtil.convert(idol.star)}"
android:textSize="20sp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:onClick="@{eventHandler.onClick}"
android:text="点赞" />
</LinearLayout>
</layout>
案例二
Activity
public class TwoDataActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityDtwoBinding viewDataBinding = DataBindingUtil.setContentView(this, R.layout.activity_dtwo);
Idol idol = new Idol("jetpack", 5);
viewDataBinding.setIdol(idol);
}
}
布局文件
<?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="idol"
type="com.zc.mydemo.jetpack.databind.Idol" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
tools:context=".jetpack.databind.demo2.TwoDataActivity">
<ImageView
android:id="@+id/image"
android:layout_width="300dp"
android:layout_height="300dp"
android:layout_marginTop="20dp" />
<!-- 二级布局的传参 idols:二级布局中的 (variable -> name) 的值 -->
<include
layout="@layout/activity_dtwo_ll"
app:idols="@{idol}" />
</LinearLayout>
</layout>
二级布局:activity_dtwo_ll.xml
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="idols"
type="com.zc.mydemo.jetpack.databind.Idol" />
<import type="com.zc.mydemo.jetpack.databind.StarUtil" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical">
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="@{idols.name}"
android:textSize="20sp" />
<TextView
android:id="@+id/star"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="@{StarUtil.convert(idols.star)}"
android:textSize="20sp" />
</LinearLayout>
</layout>
案例三
Activity
public class ThreeDataActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityThreeBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_three);
// binding.setLocalImage(R.drawable.ic_launcher_background); // 加载本地图片
binding.setNetImage("<网络图片的URL>"); // 加载网络图片
}
}
BindingAdapter
public class ImageBindingAdapter {
// 加载网络图片(第一个参数必须是ImageView)
@BindingAdapter("image")
public static void setImage(ImageView imageView, String url) {
if (!TextUtils.isEmpty(url)) {
Picasso.with(imageView.getContext()).load(url).into(imageView);
} else {
imageView.setBackgroundColor(Color.GRAY);
}
}
// 加载本地图片
@BindingAdapter("image")
public static void setImage(ImageView imageView, int res) {
imageView.setImageResource(res);
}
// 参数可选 (requireAll:false表示value值中有一个出现就会执行方法;true表示value值全部出现才会执行方法)
@BindingAdapter(value = {"image", "defaultImageResource"}, requireAll = false)
public static void setImage(ImageView imageView, String url, int res) {
if (!TextUtils.isEmpty(url)) {
Picasso.with(imageView.getContext()).load(url).into(imageView);
} else {
imageView.setImageResource(res);
}
}
}
布局文件
<?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="netImage"
type="String" />
<variable
name="localImage"
type="int" />
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".jetpack.databind.demo3.ThreeDataActivity">
<ImageView
android:id="@+id/image"
android:layout_width="300dp"
android:layout_height="300dp"
app:image="@{netImage}"
app:defaultImageResource="@{localImage}"
android:layout_centerInParent="true" />
</RelativeLayout>
</layout>