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

导入

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

Imports

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

<data>
    <import type="android.view.View"/>
</data>

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

<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:

<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”:

<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类型:

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

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

<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层次结构并将对象绑定到它,如以下示例所示:

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

    val binding: MyLayoutBinding = MyLayoutBinding.inflate(layoutInflater)

    setContentView(binding.root)
}


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

val binding: MyLayoutBinding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false)


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

val binding: MyLayoutBinding = MyLayoutBinding.bind(viewRoot)


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

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


如果在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官方认证微信卡片免费领取↓↓↓(文末还有ChatGPT机器人小福利哦,大家千万不要错过)

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

图片

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值