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老皮!!!欢迎大家来找我探讨交流👀

相关推荐
Kapaseker2 小时前
你不看会后悔的2025年终总结
android·kotlin
alexhilton5 小时前
务实的模块化:连接模块(wiring modules)的妙用
android·kotlin·android jetpack
ji_shuke6 小时前
opencv-mobile 和 ncnn-android 环境配置
android·前端·javascript·人工智能·opencv
sunnyday04268 小时前
Spring Boot 项目中使用 Dynamic Datasource 实现多数据源管理
android·spring boot·后端
幽络源小助理9 小时前
下载安装AndroidStudio配置Gradle运行第一个kotlin程序
android·开发语言·kotlin
inBuilder低代码平台9 小时前
浅谈安卓Webview从初级到高级应用
android·java·webview
豌豆学姐9 小时前
Sora2 短剧视频创作中如何保持人物一致性?角色创建接口教程
android·java·aigc·php·音视频·uniapp
白熊小北极10 小时前
Android Jetpack Compose折叠屏感知与适配
android
HelloBan10 小时前
setHintTextColor不生效
android
洞窝技术12 小时前
从0到30+:智能家居配网协议融合的实战与思考
android