DataBinding告别findViewById()
引言
你有没有在开发android应用时被各个控件的id搞的晕头转向?随着项目的量级增大,越来越多的控件id,还需要你在activity和fragment中去声明,再去通过findViewById()方法去链接控件再使用,其实大可不必!DataBinding是JetPack中的成员,它的一大功能就是简化繁琐的findViewById()实现控件id自由。
介绍
DataBinding,就如同它的名字一样,数据绑定。以声明方式将可观察数据绑定到界面元素,通常和ViewModel配合使用。(本文主要讲如何使用DataBinding及其原理)之后会在ViewModel讲解中将两者结合起来使用尽享丝滑~
如何使用
第一步:启用DadaBinding
只需要启用就能使用:(module下的build.gradle)
android {
....
dataBinding {
enabled = true
}
}
第二步:布局文件中进行databinding绑定
绑定前:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".show.Case19">
</androidx.constraintlayout.widget.ConstraintLayout>
绑定方法:
window下:鼠标放置在最外层控件上,即androidx.constraintlayout.widget.ConstraintLayout上,按Alt+Insert快捷键出现右键,点击Convert data binding layout
mac下:同理,只不过快捷键换成了option+enter键
绑定后的布局变成了这样:
<?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>
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".show.Case19">
<TextView
android:id="@+id/tv_DataBindingShow"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="20sp"
tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
我在布局里面简单添加了个TextView控件,设置了id值。
第三步:在Activity中使用databinding
public class Case19 extends AppCompatActivity {
private ActivityCase19Binding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_case19); //默认布局
binding = DataBindingUtil.setContentView(this,R.layout.activity_case19);
binding.tvDataBindingShow.setText("我是千夜零一,期待你的关注!");
}
}
运行效果
![](https://img.haomeiwen.com/i20285170/73e67c06d318c5c8.gif)
取代findViewById方法
【解析】
1.为什么它能这样不通过findViewById就能调用控件的id呢?
采用 DateBinding 后,所有的 View 会在 Binding 实例类生成对应的实例,而有 id 的 View 则会使用 public 进行修饰,而变量名的生成规则是==通过下划线分割大小写==,即 id = "@+id/main_view" 会生成对应的 mainView 的变量,我们可以直接通过 binding.mainView 获取,直接节省了在 activity 中声明一长串变量的步骤,也不需要再写 findViewById 方法或者加上 @BindView 的注解。
【解析】
2.DataBinding绑定后声明binding的ActivityCase19Binding类哪里来的?
这是系统帮我们自动创建的,它的类名的生成规则是如果你是在Activity中声明DataBinding对象,则Activity打头,Fragment同理,其后跟着你的Activity名称,最后加上Binding,即,就是示例中的ActivityCase19Binding。这就是DataBinding帮我们创建的DataBinding对象。
【解析】
3.DataBinding绑定后声明的binding到底为什么能获取到id呢,又是怎么取代findViewById()方法的呢?
这就不得不说到它绑定布局的方法了,它通过DataBindingUtil.setContentView()方法绑定布局layout文件,之后的操作在绑定这一步完成后全部交由DataBinding生成的ActivityCase19BindingImpl类去完成。
你可能在打出ActivityCase19Binding之后就发现了DataBinDing也自动帮我们生成了这个工具类,用于将binding.tvDataBindingShow与布局文件中的控件联系起来,而这全部是由DataBinding来自动帮我们实现的。这就是它的强大之处啊!
拓展
这只是JetPack中的DataBinding的一个简单功能,之后更多好玩的需要结合ViewModel才能发挥出来,dataBinding+viewModel也是MVVM模式项目的标准搭配。