Android DataBinding——导入以及生成的绑定类

导入

DataBinding库提供了导入、变量和include等功能。导入可以方便在引用布局文件中引用类;变量允许您描述可在绑定表达式中使用的属性;Includes允许您在整个应用程序中重用复杂的布局。

Imports

Imports允许您轻松地在布局文件中的引用类,就像在代码中一样。data元素内部可以使用零个或多个import元素。以下代码示例将View类导入布局文件:

java 复制代码
<data>
    <import type="android.view.View"/>
</data>

通过导入View类,可以从绑定表达式中引用它。以下示例显示了如何引用View类的VISIBLE和GONE常量:

java 复制代码
<TextView
   android:text="@{user.lastName}"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>

类型别名alias

当存在类名冲突时,其中一个类可能会重命名为别名。以下示例将com.example.realstate包中的View类重命名为Vista:

java 复制代码
<import type="android.view.View"/>
<import type="com.example.real.estate.View" alias="Vista" />

您可以使用Vista引用com.example.real.estate.View和View可以用于引用布局文件中的android.View.View。

导入其他类

导入的类型可以用作变量和表达式中的类型引用。以下示例显示了用作变量类型的"User"和"List":

java 复制代码
<data>
    <import type="com.example.User"/>
    <import type="java.util.List"/>
    <variable name="user" type="User"/>
    <variable name="userList" type="List&lt;User>"/>
</data>

注意:Android Studio尚未处理导入,因此导入变量在IDE中还不能自动补全,但您的应用程序仍可以编译,您可以通过在变量定义中使用完全限定的名称来解决IDE问题。

也可以使用导入的类型强制转换表达式的一部分。以下示例将连接属性强制转换为User类型:

java 复制代码
<TextView
   android:text="@{((User)(user.connection)).lastName}"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"/>

在表达式中引用静态字段和方法时,也可以使用导入的类型。以下代码导入MyStringUtils类并引用其大写方法:

java 复制代码
<data>
    <import type="com.example.MyStringUtils"/>
    <variable name="user" type="com.example.User"/>
</data>
...
<TextView
   android:text="@{MyStringUtils.capitalize(user.lastName)}"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"/>

就像在java代码中一样,java.lang.*是自动导入的。

生成的绑定类

DataBinding库会生成用于访问布局的变量和视图的绑定类。本文档展示了如何创建和自定义生成的绑定类。

生成的绑定类将布局变量与布局中的视图链接起来。您可以自定义绑定的名称和包。所有生成的绑定类都继承自ViewDataBinding类。

框架会为每个布局文件生成一个绑定类。默认情况下,类的名称将布局文件的名称是转换为Pascal大小写并添加Binding后缀。因此,例如,如果布局文件名为activity_main.xml,则相应生成的类为ActivityMainBinding。此类保存从布局属性到View的所有绑定,并知道如何为绑定表达式赋值。

生成绑定对象

绑定对象在inflate布局后立即创建,以确保布局中设置有表达式的View的层次结构在绑定数据之前不会被修改。将对象绑定到布局的最常见方法是在绑定类上使用静态方法。您可以使用绑定类的inflate() 方法来加载View层次结构并将对象绑定到它,如以下示例所示:

java 复制代码
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val binding: MyLayoutBinding = MyLayoutBinding.inflate(layoutInflater)

    setContentView(binding.root)
}

还有另外一个重载的inflate()方法,它除了LayoutInflater对象外,还接受ViewGroup对象,如以下示例所示:

java 复制代码
val binding: MyLayoutBinding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false)

如果使用不同的机制对布局进行inflate,则可以将其单独绑定,如下所示:

java 复制代码
val binding: MyLayoutBinding = MyLayoutBinding.bind(viewRoot)

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

java 复制代码
val viewRoot = LayoutInflater.from(this).inflate(layoutId, parent, attachToParent)
val binding: ViewDataBinding? = DataBindingUtil.bind(viewRoot)

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

java 复制代码
val listItemBinding = ListItemBinding.inflate(layoutInflater, viewGroup, false)
// or
val listItemBinding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false)

👀关注公众号:Android老皮!!!欢迎大家来找我探讨交流👀

相关推荐
三少爷的鞋3 小时前
AI 时代,我们都将成为通才型开发者:只懂 Android,已经不够了
android
Dovis(誓平步青云)7 小时前
家里设备越来越多,如何用一张空间地图控制灯光和温度![
android·java·前端·javascript·人工智能·电脑
晚风叙码8 小时前
MySQL 数据类型详解:从数值到字符串,一篇讲透
android·mysql·adb
传奇开心果编程9 小时前
【Compose Multiplatform 跨端开发学与练】第3课 布局与组件
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程12 小时前
【Compose Multiplatform 跨端开发学与练】第8课 资源管理与主题
android·windows·学习·ios·kotlin·web·composer
传奇开心果编程13 小时前
【Compose Multiplatform 跨端开发学与练】第9课 测试与调试
android·学习·macos·ios·kotlin·web·composer
传奇开心果编程13 小时前
【Compose Multiplatform 跨端开发学与练】第4课 导航与路由
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程14 小时前
【Compose Multiplatform 跨端开发学与练】第6课 状态管理与架构
android·学习·ui·ios·架构·kotlin·composer
事圆则缓14 小时前
Android AOSP 定制常见概念:源码目录、系统镜像与刷机流程
android
传奇开心果编程14 小时前
【Compose Multiplatform 跨端开发学与练】第2课 Compose 基础语法
android·windows·学习·ui·ios·kotlin·composer