我正在阅读MVVM架构如何工作以及如何使用Android数据绑定库帮助。
我非常一般地了解Android数据绑定在UI层和保存要显示的信息的基础数据模型之间创建了一个链接。
Kotlin Android Extensions是另一款Kotlin插件,可让您从“活动”,“片段”和“视图”中恢复视图。该插件将生成一些额外的代码,允许您访问XML布局中的视图,就像它们是具有您在布局定义中使用的ID名称的属性一样。
使用Android数据绑定库和Kotlin Android扩展程序有什么区别?它们用于不同的目的吗?他们以什么方式相互补充?
感谢您的回答。
答案 0 :(得分:16)
Kotlin Android Extensions和Android数据绑定库都有助于消除findViewById
的使用。
但是这些事情还有更多可以相互补充的事情。
要详细说明,使用Android数据绑定库,您可以在xml文件中“设置”模型,然后可以直接利用这些模型为布局中的视图设置值。 See <data>
标记如何与数据绑定库一起使用。
Kotlin android扩展程序不提供此功能。
与此同时,Kotlin android扩展提供了一些令人惊叹的功能,如@parcelize
注释,使类几乎没有样板代码等等。
总而言之,虽然它们都消除了findViewById
的使用,但它们也有自己的特点,可以相互补充。
答案 1 :(得分:7)
Kotlin Android扩展不代表仅视图绑定。它还包含其他功能。但是我想您是在谈论Kotlin Android扩展程序的视图绑定/缓存功能,并且想知道我们是否仍然需要数据绑定,因为我们已经摆脱了具有Kotlin综合属性的findViewById调用。这是我问自己的问题,我的结论是,是的,数据绑定仍然值得使用。
数据绑定库在绑定中创建一个不可变字段 布局中具有ID的每个视图的类...库提取 包含视图层次结构中的ID的视图通过一次传递。 该机制比调用findViewById()方法更快 布局中的每个视图。
因此,数据绑定不会一一调用视图上的findViewById。另一方面,Kotlin的综合类仍在幕后的视图上调用findViewById,但对于每个视图仅调用一次,并为下一次调用缓存视图引用。 (这里是article的内容)
此外,数据绑定提供的功能不仅仅是视图缓存。您可以使用数据标签将数据传递到绑定实现,并在xml中声明它们,而无需通过编程方式进行设置。您可以使用可观察字段,绑定适配器,甚至双向数据绑定。用尽所有功能后,它可以大大减少您的java / kotlin代码。
答案 2 :(得分:1)
我非常不同意上述观点。也许是因为我讨厌用XML编写逻辑。因此两条注释都提到了<data>
标签的使用,这些标签在Kotlin Android扩展(KTX)中找不到。使用Kotlin和KTX,您可以做得比数据标签更好。
假设我们有
data class Person(val name:String,
val phone:String,
val isMale:Boolean,
val isMarried:Boolean)
在活动或片段中,我们可以做到
fun updateView(data:Person){
with(data){
nameTextField.text = if(isMale){
"Mr. $name"
} else {
if(isMarried){
"Mrs. $name"
}else{
"Miss $name"
}
}
phoneTextField.text = phone
}
}
在数据绑定中,您必须这样做
android:text='@{person.isMale ? "Mr."+user.name: ((user.isMarried ? "Mrs. " :
"Miss. ") + user.name)}'
KTX代码比实现相同结果所需的数据绑定方法更加简洁。当您需要条件来设置值以查看数据绑定时,将变得很丑陋。 所以对我来说,Kotlin Android Extensions可以更好地工作。我喜欢干净的代码。您仍然可以同时使用两个决定。