Bootstrap

Android DataBinding开始使用以及布局详解

DataBinding 开始使用

了解如何为您的开发环境支持使用DataBinding,包括在Android Studio中支持数据绑定代码。

DataBinding提供了灵活性和广泛的兼容性-它是一个支持库,因此您可以将其用于运行Android 4.0(API 14级)或更高版本的设备。

我们建议在您的项目中使用最新的Android Gradle插件。但是,1.5.0及更高版本支持数据绑定。有关更多信息,请参阅如何update the Android Gradle plugin

构建环境

要开始使用DataBinding,请从Android SDK管理器中的支持库下载该库。有关更多信息,请参阅[更新IDE和SDK工具]

要将应用程序配置为使用数据绑定,请在应用程序模块的“build.gradle”文件中启用“dataBinding”构建选项,如以下示例所示:

android {
    ...
    buildFeatures {
        dataBinding true
    }
}

您必须为依赖于使用数据绑定的库的应用程序模块配置DataBinding,即使应用程序模块不直接使用DataBinding

Android Studio 对 data binding的支持

Android Studio支持数据绑定代码的许多编辑功能。例如,它支持数据绑定表达式的以下功能:

  • 语法高亮
  • 标记表达式语言语法错误
  • XML代码补全
  • 引用,包括导航(例如导航到声明)和快速文档

注意:数组和泛型类型(如Observable接口)可能会错误地显示错误。

布局编辑器中的“预览”窗格显示数据绑定表达式的默认值(如果提供)。例如,“预览”窗格在以下示例中声明的TextView小部件上显示my_default值:

<TextView android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{user.firstName, default=my_default}"/>

如果仅在项目的设计阶段需要显示默认值,则可以使用工具属性而不是默认表达式值,如“工具属性”参考中所述。

DataBinding 布局

表达式语言允许您编写处理View事件的表达式。DataBinding会自动生成将布局中的View与数据对象绑定所需的类。

DataBinding布局文件略有不同,以布局的根标记开头,后跟数据元素和视图根元素。这个视图元素是非绑定布局文件中的根元素。以下代码显示了一个示例布局文件:

<?xml version="1.0" encoding="utf-8"?>
<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}"/>
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.lastName}"/>
   </LinearLayout>
</layout>

data节点中的变量user描述了一个可能会在布局中使用的变量

<variable name="user" type="com.example.User" />

布局中元素的属性可以使用“@{}”语法来执行其中的表达式获取值。这里,TextView文本设置为user变量的firstName属性:

<TextView android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="@{user.firstName}" />

备注:布局中的表达式应当保持精简,因为它们不能进行单元测试,并且IDE支持有限。为了简化布局表达式,可以使用自定义binding adapters.

Data object

现在我们假设您有一个简单对象来描述User实体:

data class User(val firstName: String, val lastName: String)

这种类型的对象具有不会改变的数据。这在一个应用中,如果只读取一次并且以后不再修改的,这是一种常见的情况。也可以使用遵循Java约定的对象,例如Java中使用getter方法,如以下示例所示:

public class User {
  private final String firstName;
  private final String lastName;
  public User(String firstName, String lastName) {
      this.firstName = firstName;
      this.lastName = lastName;
  }
  public String getFirstName() {
      return this.firstName;
  }
  public String getLastName() {
      return this.lastName;
  }
}


从数据绑定的角度来看,这两个类是等价的。用于android:text属性的表达式@{user.firstName} 访问前一个类中的firstName字段和后一个类的getFirstName方法。或者,如果该方法存在,它也被解析为firstName()。

绑定数据

编译器会为每个布局文件生成一个绑定类。默认情况下,类的名称基于布局文件的名称,将其转换为Pascal大小写并添加Binding后缀。上述布局文件名为activity_main.xml,因此相应生成的类为ActivityMainBinding。此类保存从布局属性(例如,用户变量)到布局视图的所有绑定,并知道如何为绑定表达式赋值。建议创建绑定的方法是在inflate布局时进行绑定,如以下示例所示:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val binding: ActivityMainBinding = DataBindingUtil.setContentView(
            this, R.layout.activity_main)

    binding.user = User("Test", "User")
}


在运行时,应用程序会在UI中显示这个User对象“Test”。或者,您可以使用LayoutInflater获取View,如以下示例所示:

val binding: ActivityMainBinding = ActivityMainBinding.inflate(getLayoutInflater())


如果在Fragment、ListView或RecyclerView适配器中使用数据绑定项,则可能更喜欢使用绑定类或DataBindingUtil类的inflate方法,如以下代码示例所示:

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


最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
img
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓

PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题
图片

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;