Jetpack -- DataBinding
2020-02-28 本文已影响0人
Anwfly
一.概述
2015年Google推出一个数据绑定框架DataBinding,以前都是结合MVVM使用的,2018年被Google入列到Jetpack的架构中,配合LiveData、ViewModel使用简直完美。
DataBinding是以声明的方式将可观察的数据绑定到界面元素。
简言之,Controller和View层彻底解耦,靠DataBinding实现数据绑定。
image.png
二.特点
- 优点
①moudle与ViewD的几乎完全解耦;
②节省大量代码,如findViewById,adapter,setOnClick()....
③布局的性能优于findviewbyId
④结合AAC(Android Architecture Components)对app的生命周期的一系列操作更加便捷
2.缺点
①xml的赋值方法比较奇怪,杜宇没有掌握DataBinding的开发者代码阅读起来会很头疼,代码量大的时候会显得很混乱;
②出现问题不是很好定位(比如说偶尔的xml忘记导包,导致编译错误等等)
三.使用
先看效果图,点踩减一,点赞加一:
screen1.png
1.使用ViewModel存放界面数据
public class AnflyViewModel extends ViewModel {
private MutableLiveData<Integer> number;
public MutableLiveData<Integer> getNumber() {
if (number == null) {
number = new MutableLiveData<>();
//默认为0
number.setValue(0);
}
return number;
}
/**
* 功能为自身加一
*/
public void like() {
number.setValue(number.getValue() + 1);
}
/**
* 功能为自身减一
*/
public void disLike() {
number.setValue(number.getValue() - 1);
}
}
2.在gradle中添加DataBinding允许
defaultConfig {
....
dataBinding {
enabled = true
}
}
3.具体使用DataBinding
①在主界面布局左上角,有一个灯泡,点击
1582902943(1).png
②选中“Convert to data bindind layout”
1582903164(1).png
点击后,Acitivity或者fragment的布局最外层嵌套一层layout,并且多了一对标签data
现在布局就可以像代码一样操作了
③在Mainactivity修改
public class MainActivity extends AppCompatActivity {
private AnflyViewModel anflyViewModel;
private ActivityMainBinding dataBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//1.注释掉以前的setContentView,使用DataBindingUtil.setContentView()加载布局,返回ActivityMainBinding
//他是layout的绑定类,layout中的控件都是他的成员,可以直接调用
//setContentView(R.layout.activity_main);
dataBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
//获取Viewmodel
anflyViewModel = ViewModelProviders.of(this).get(AnflyViewModel.class);
//给layout反向绑定数据的时候需要设置数据持有者
dataBinding.setData(anflyViewModel);
//设置布局绑定类生命周期的拥有者
dataBinding.setLifecycleOwner(this);
}
}
④layout可以反向绑定数据:
android:text="@{String.valueOf(data.number)}"
,
android:onClick="@{()->data.disLike()}"
<?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是你为这个xml定义的一个个变量.如下,你需要给它起一个名字name,
然后你需要为他指定一个type,这个type可以使你上面导包的类名,也可以是一个类的全类名,也可是是你导包
时候设置的别名,variable支持后多类型,比如String,int.....
<variable
name="data"
type="com.anfly.databinding.AnflyViewModel" />
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="100dp"
android:text="@{String.valueOf(data.number)}"
android:textColor="@color/colorAccent"
android:textSize="50sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/tv_number"
android:layout_marginTop="150dp"
android:gravity="center_horizontal">
<ImageView
android:id="@+id/iv_dislike"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{()->data.disLike()}"
android:src="@drawable/ic_thumb_down_black_24dp" />
<ImageView
android:id="@+id/iv_like"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="100dp"
android:onClick="@{()->data.like()}"
android:src="@drawable/ic_thumb_up_black_24dp" />
</LinearLayout>
</RelativeLayout>
</layout>