绑定类,它是由数据绑定库产生的,用于存取布局中变量和视图。内容提要:如何产生绑定类及如何定制绑定类。这里所谓的定制,是绑定类的包名和类名是可以定制的。所有绑定类都是继承了ViewDataBinding这个基类。
前两节提到了布局文件表达式,及布局文件DATA标签中生成的BR类,和三种用于控件自动刷新的数据类型。下面再细说下绑定类,是怎么回事,它是根据局面文件生成的,这种布局文件是具有数据绑定属性的。BR类是一个模块包文件才一个。而绑定类则对应于具有数据绑定属性的布局文件,可以有多个。
通常默认情况,根据布局文件名,按照PASCAL规则生成,以Binding为结尾。绑定类一方面包括了布局中的变量,视图以及如何为绑定表达式求值。
一、创建绑定对象。我们应该在一完成布局后,就创建创建绑定对象,这样避免在绑定变量视图之前,视图层次发生变动。最常用的方法是使用静态方法,因为生成的绑定类是抽象类。这样,你在展开inflate具有层次的视图,并将它绑定给一个对象上时,用绑定用于类的静态inflate()方法,它需要一个LayoutInflater的参数,它是一类对象,将xml文件转化为视图view对象。如:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater());
}
另外一个inflate()版本,除了LayoutInflater外,用一个ViewGroup参数。如示,
MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false);
其实,上面并没有布局显示在app中,我用下面这样的:
AcitvityMainBinding binding = DataBindingUtil.inflate(this, R.layout.activiy-main);
二、View with Id
在布局文件中带ID的view,都会生成一条记录存在于生成的绑定类中。不带有数据的View其ID没有什么必要,也存在一些情况从代码访问View.仍需要findViewById();
三、Variables
声明为变量,数据第一项都会在生成类相应的保护属性,并提供相应的存取getter()及setter()方法。所以可能通过绑定类的实例给那些变量设值可改变什么。
四、ViewStub
ViewStub在哪儿,可以在在于layou文件标签中,当然也可以在代码中写,是一个原本有的类。
ViewStub不像普通的View,它是一开始就是不可见的,并最将消失的。当它被设为可见或明确扩展inflate时,它们会通过inflate其他布局来代替自己。因为它本视图层次中,本质上是要消失的,绑定对象中的视图也同样能被垃圾回收器所回收。因为定义这些视图都是final不可变的,在生成的绑定类中,一个ViewStubProxy对象代替
ViewStub对象,当ViewStub存在时让你能能存取它,同样也可以存取由它扩展后的层次视图。
当扩展另一个布局时,必须为新的布局建立绑定。因此,当需要绑定时,ViewStubProxy必须收到一个
ViewStub OnInflateListener
建立绑定。在给定时刻只允许一个OnInflateListener
存在,所以ViewStubProxy允许你设定一个 OnInflateListener,它会在建立绑定之后调用。
五、立即时绑定与高级绑定
当一个变量或者可测量对象变化时,绑定要在下帧前按计划变化。有些时候,需要绑定要立即执行这个变化。那么强制立即执行就用executePendingBindings()这个方法。
高级绑定
泛型变量
有时指定的变量类型,不能具体的明确。比如 RecyclerView.Adapter,它操作任意型布局,却不知道要绑定具体的类。在调用
onBindViewHolder()时,却必须给它一个参数。下面的例子,RecyclerView绑定的所有布局中都有Item变量,BindingHolder
对象有个方法 getBinding()
,它返回 ViewDataBinding这个基类。前面也说过,我们所有的绑定类都继承自它。
public void onBindViewHolder(BindingHolder holder, int position) {
final T item = items.get(position);
holder.getBinding().setVariable(BR.item, item);
holder.getBinding().executePendingBindings();
}
BR,是数据绑定库在生成包下面的绑定数据资源类文件。包含所有的绑定的数据变量条目。
后台进程
你的数据模型不是一个容器时,你可以在后台进程中更新你的数据。数据局部求值避免一对待性问题。
定制绑定类名字
默认情况下,绑定类的名字是根据布局文件的名字产生的。以一个大字字母开头,并去除下划线,首字母化接下来的字母,并以单词Binding为后缀。这个绑定类放在你的模块包下的databinding包下。比如,contact_item.xml
产生的绑定类名是, ContactItemBinding
。假如模块包名是 com.example.my.app
, 那么产生的的绑定类文件位置是com.example.my.app.databinding
这包下面。通过调整data类的属性可以调整产生绑定类的名字或位置,也即可layout文件中调整data标签中属性。我们都知道layout文件中标签都相应的类与之对应的。
<data class="ContactItem">
…
</data>
这在databinding包下面生成ContactItem绑定类文件。
<data class=".ContactItem">
…
</data>
这会产生当前包文件下生成绑定类,也可以指定包下面生成绑定类,这样:
<data class="com.example.ContactItem">
…
</data>