Android数据绑定库与Kotlin Android扩展程序

时间:2018-05-08 04:55:58

标签: android binding kotlin

我正在阅读MVVM架构如何工作以及如何使用Android数据绑定库帮助。

我非常一般地了解Android数据绑定在UI层和保存要显示的信息的基础数据模型之间创建了一个链接。

Kotlin Android Extensions是另一款Kotlin插件,可让您从“活动”,“片段”和“视图”中恢复视图。该插件将生成一些额外的代码,允许您访问XML布局中的视图,就像它们是具有您在布局定义中使用的ID名称的属性一样。

使用Android数据绑定库和Kotlin Android扩展程序有什么区别?它们用于不同的目的吗?他们以什么方式相互补充?

感谢您的回答。

3 个答案:

答案 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调用。这是我问自己的问题,我的结论是,是的,数据绑定仍然值得使用。

来自official documentation

  

数据绑定库在绑定中创建一个不可变字段   布局中具有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可以更好地工作。我喜欢干净的代码。您仍然可以同时使用两个决定。