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开发的各个知识点。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。
欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓
PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题