DataBinding使用指南(三):生成的binding类

DataBinding使用指南(一):布局和binding表达式

DataBinding使用指南(二):使用可观察的数据对象

DataBinding使用指南(三):生成binding类

DataBinding使用指南(四):BindingAdapter

DataBinding使用指南(五):绑定布局视图到架构组件



DataBinding库会帮我们生成用于访问布局中的变量和View 的Binding类,这一节将说明如何创建和自定义生成的Binding类。

DataBinding库会为每个布局文件生成一个binding类,生成的 binding 类将布局中的 View 与布局变量链接起来,并且我们可以自定义binding 类的名称和包,另外所有生成的 binding 类都继承自ViewDataBinding

默认情况下,该类的名称基于布局文件的名称,将布局名称转换为Pascal格式并向其添加Binding后缀。例如布局文件名是 activity_main.xml,相应的生成MainActivityBinding类 。这个类持有了布局属性(例如user变量)到布局View的所有绑定,并知道如何为绑定表达式分配值。

创建Binding对象


binding 对象应该在 inflat 布局后立即创建,以确保 View 层次在绑定到布局中的表达式视图之前不被修改。将对象绑定到布局的最常见方法是使用绑定类的静态方法,我们可以先将视图层次inflate ,然后使用 binding类的inflate()方法,,膨胀视图层次结构并将其绑定到该层次结构,如下例所示:

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater());
}

还有另一个版本inflate()方法,它除了LayoutInflater对象之外还需要一个ViewGroup对象,请看下面的例子:

MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false);

如果使用不同的机制 inflate 布局,则可以分别进行绑定,如下所示:

MyLayoutBinding binding = MyLayoutBinding.bind(viewRoot);

有时候预先不知道绑定类型,在这种情况下,可以使用DataBindingUtil类创建绑定 ,如下面的代码片段所示:

ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater, layoutId,
    parent, attachToParent);
ViewDataBinding binding = DataBindingUtil.bindTo(viewRoot, layoutId);

如果我们在一个FragmentListViewRecyclerViewAdapter中使用数据绑定 Item,我们可能更偏向于使用绑定类的 inflate()方法 或 DataBindingUtil类,如下面的代码所示:

ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false);
// or
ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);

带ID的View


DataBinding库会在binding类中为布局中每个具有ID的View创建一个不可变字段。例如,DataBinding库从以下布局创建TextView类型的firstNamelastName字段:

<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"
		   android:id="@+id/firstName"/>
		   
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.lastName}"
		   android:id="@+id/lastName"/>
		   
   </LinearLayout>
</layout>

DataBinding库一次性从View层次结构中提取包含ID的View,此机制要比调用findViewById()`方法访问View更快。

ID在数据绑定中并不是必须的,但有些情况下仍然需要在代码中访问View。

变量


Databinding库会为布局中声明的每个变量生成访问器方法。例如,下面布局的binding类中会为user,image和note变量生成 setter 和getter方法:

<data>
   <import type="android.graphics.drawable.Drawable"/>
   <variable name="user" type="com.example.User"/>
   <variable name="image" type="Drawable"/>
   <variable name="note" type="String"/>
</data>

ViewStub


与普通View不同,ViewStub对象以不可见View开始,当它变得可见时,或被明确告知 inflate 时,他们通过 inflate 另一个布局来替换自身。

由于ViewStub实质上从 View层次结构中消失了,binding对象中的View也必须消失以便垃圾回收。因为这些View是 final 的,所以在生成的绑定类中一个 ViewStubProxy对象会替代ViewStub,让我们可以在ViewStub存在的情况下访问它,并在ViewStub已经 inflate时访问 inflated 的 View 层次结构。

当 inflating另一个布局时,必须为新布局建立绑定,因此,ViewStubProxy必须要监听ViewStubOnInflateListener并在必要时建立绑定。由于在给定时间只有一个监听器可以存在,所以 ViewStubProxy允许我们设置一个OnInflateListener,它在建立绑定后调用。

立即Binding


当一个变量或可观察对象发生更改时,绑定会安排在下一帧更改之前。然而,有时候,绑定必须立即执行,要想强制执行,请使用 executePendingBindings() 方法。

高级Binding


动态变量

有时候,特定的绑定类是未知的。例如,RecyclerView.Adapter针对任意布局进行操作,所以不知道特定的binding类,但它仍然必须在调用onBindViewHolder()方法期间分配 binding 值。

在下面示例中,RecyclerView绑定的所有布局都有一个 item变量,该BindingHolder对象有一个getBinding()方法,会返回ViewDataBinding基类 。

public void onBindViewHolder(BindingHolder holder, int position) {
  final T item = mItems.get(position);
  holder.getBinding().setVariable(BR.item, item);
  holder.getBinding().executePendingBindings();
}

注意:DataBinding库会在模块包中生成一个名为BR的类,其中包含用于数据绑定的资源的ID。在上面的例子中,DataBinding库自动生成了BR.item变量。

后台线程


我们可以在后台线程中更改数据模型,只要它不是集合。 DataBinding在计算期间会本地化每个变量或字段以避免任何并发问题。

自定义binding类名


在默认情况下,绑定类根据布局文件的名称生成,以大写字母开头,删除下划线(_),大写接下来的字母,并加上后缀 Binding。该类放在 databinding模块包下的包中。例如,布局文件 contact_item.xml 生成ContactItemBinding类。如果布局所在模块包是com.example.my.app,则binding类会被放置在 com.example.my.app.databinding包中。

我们可以通过调整data元素的class属性,将 binding 类进行重命名或放置在不同的包中。例如,以下布局会生成ContactItem binding类,位于当前模块的databinding包中:

<data class="ContactItem">
    …
</data>

我们可以通过在类名前添加一个句点来在不同的包中生成binding类。以下示例在模块包中生成binding类:

<data class=".ContactItem">
    …
</data>

我们也可以在要生成binding类的位置使用完整的包名称。以下示例在com.example包中创建ContactItem 绑定类 :

<data class="com.example.ContactItem">
    …
</data>

本文最近更新日期: 2018年4月26日。

DataBinding使用指南(一):布局和binding表达式

DataBinding使用指南(二):使用可观察的数据对象

DataBinding使用指南(三):生成binding类

DataBinding使用指南(四):BindingAdapter

DataBinding使用指南(五):绑定布局视图到架构组件

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ViewBindingDataBinding都是Android开发中的数据绑定框架,它们可以将布局文件中的视图与代码中的变量绑定起来,从而方便地操作视图和数据。 ViewBindingAndroid官方在Android Studio 3.6中推出的一个新特性,它通过生成一个与布局文件对应的绑定来实现视图绑定,可以避免findViewById的繁琐操作,提高代码的可读性和可维护性。 DataBinding是Google在Android Studio 1.3中推出的一个数据绑定框架,它可以将数据与视图绑定起来,实现双向绑定,从而简化了代码的编写和维护。使用DataBinding可以将视图的属性和数据模型的属性绑定起来,当数据模型的属性发生变化时,视图会自动更新,反之亦然。 总的来说,ViewBinding适用于简单的视图绑定场景,而DataBinding则适用于更复杂的数据绑定场景。 ### 回答2: ViewBindingDataBinding都是Android中的数据绑定库。它们旨在使应用程序中的 UI 和逻辑分离,同时还可以减少模板化代码。虽然它们都执行似的任务,但它们之间存在一些区别。 首先,ViewBinding是针对单个视图文件生成绑定。这样,在绑定代码中,您只能访问单个视图。因此,ViewBinding的代码量要比DataBinding少。 相比而言,DataBinding要复杂一些。 DataBinding不仅可用于绑定单个视图,还可用于绑定整个布局层次结构。它需要实现一整套工具来使数据绑定的代码与布局文件相对应。 其次,ViewBinding是使用annotation处理器生成绑定的方式实现数据绑定,这意味着它可以相对快速地编译布局文件。另一方面,DataBinding需要生成额外的 Java 代码和一些 XML 文件来实现数据绑定,这使编译时间更长。 但是,DataBinding可以使用双向绑定技术,这意味着数据的变化可以直接反映到视图中。这使得在处理表单输入等特定场景时使用DataBinding会更容易一些。 总体而言,ViewBinding是更简单的选择,适合较小的项目,而DataBinding则更为复杂,适合需要大规模数据绑定的项目。它们都是可用的解决方案,您可以根据需求进行选择。 ### 回答3: ViewBindingDataBindingAndroid中的两种视图绑定库。两者的共同点是都可以通过自动生成绑定来实现视图的绑定,从而避免了findViewById的繁琐操作;不同点在于ViewBinding的目的是简化视图绑定,而DataBinding则可以实现更复杂的数据绑定数据处理。 ViewBinding的主要作用是消除繁琐的findViewById操作,并且能够更好地保证型安全。使用ViewBinding,我们只需要在需要进行视图绑定的Activity或Fragment中引入绑定,然后通过绑定实例来访问布局文件中所包含的所有控件。ViewBinding使用起来非常简单,只需要在build.gradle中添加如下配置即可: android { ... viewBinding { enabled = true } } 使用ViewBinding的代码示例: private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) binding.textView.text = "Hello ViewBinding" } 对于DataBinding而言,它能够更好地实现数据绑定数据处理,可以使用表达式将数据绑定到视图上,进行数据转换和格式化,从而实现更灵活的UI界面。使用DataBinding需要在build.gradle中添加如下配置: android { ... dataBinding { enabled = true } } 使用DataBinding的代码示例: <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <data> <variable name="user" type="com.example.User" /> </data> <LinearLayout ... > <TextView ... android:text="@{user.name}" /> <TextView ... android:text="@{user.age,StringFormat}" /> <Button ... android:onClick="@{() -> user.onButtonClick()}" android:text="@{user.buttonText}" /> </LinearLayout> </layout> DataBinding可以更好地实现MVC中的数据与视图分离,也可以通过ViewModel和LiveData等技术实现MVVM模式。在使用DataBinding开发过程中,需要注意避免过于复杂的绑定表达式和数据转换等操作,以及注意内存泄漏的问题。 总的来说,ViewBindingDataBinding都是非常有用的Android开发库,可以根据具体的需求来选择使用哪种库,在提高开发效率的同时也能提升应用程序的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值