代码之家  ›  专栏  ›  技术社区  ›  Jon

Android数据绑定库与Kotlin Android扩展

  •  49
  • Jon  · 技术社区  · 6 年前

    我正在阅读MVVM体系结构的工作原理以及如何使用Android数据绑定库帮助。

    一般来说,我理解Android数据绑定在UI层和保存要显示的信息的底层数据模型之间创建了一个链接。

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

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

    谢谢你的回答。

    3 回复  |  直到 6 年前
        1
  •  30
  •   Supriya    6 年前

    Kotlin Android扩展和Android数据绑定库都有助于消除 findViewById

    但是,它们还可以做更多的事情,相互补充。 更详细地说,使用Android数据绑定库,您可以在xml文件中“设置”模型,然后可以直接利用这些模型为布局中的视图设置值。 See 如何 <data> 标记可以与数据绑定库一起使用。

    Kotlin android extensions没有提供此功能。 同时,Kotlin android扩展还提供了一些惊人的功能,如 @parcelize 注释使类可以打包,几乎没有样板代码,等等。

    总之,虽然它们都消除了 findViewById ,它们也有各自的特点,可以很好地相互补充。

        2
  •  30
  •   Oya Canli    4 年前

    Kotlin Android Extensions不仅仅代表视图绑定。它还包含其他功能。但我猜你在谈论Kotlin Android扩展的视图绑定/缓存功能,并想知道我们是否仍然需要数据绑定,因为我们已经摆脱了具有Kotlin合成属性的findViewById调用。这是我问自己的问题,我的结论是, 是的,数据绑定仍然值得使用。

    从…起 official documentation :

    数据绑定库在绑定中创建一个不可变字段 为库提取的布局中具有ID的每个视图初始化 在单个过程中包含视图层次结构中的ID的视图。 此机制可能比调用findViewById()方法更快 对于布局中的每个视图。

    因此,数据绑定不会逐个调用视图上的findViewById。另一方面,Kotlins合成类仍然在引擎盖下的视图上调用findViewById,但它只对每个视图调用一次,并缓存视图引用以供下次调用。(这是一个 article 关于它)

    此外,数据绑定提供的不仅仅是视图缓存。您可以使用数据标记将数据传递给绑定实现,并在xml中声明它们,而不是以编程方式进行设置。通过这种方式,您可以摆脱用于填充数据的样板代码,如“setText”、“setImageResource”等。您可以使用数据绑定从xml设置事件监听器。您还可以使用自定义绑定适配器提供自己的属性。当使用它的全部功能时,它可以显著减少Java/Kotlin代码。

    编辑: 谷歌安卓团队似乎建议 反对 使用kotlin合成特性。 This article 总结围绕此问题的讨论。你可以在新的 Udacity course 由Google编写,他们使用数据绑定作为推荐做法。

    编辑2: 如果您不喜欢“在xml中放置业务逻辑”,如果您对设置或获取xml数据不感兴趣,如果您只是想避免以安全高效的方式使用FindViewById,那么您可以 视图数据绑定 而不是库。它是数据绑定库的简化版本。它不允许您从xml中设置数据,但它以安全有效的方式绑定视图。

        3
  •  1
  •   Manzur Alahi    5 年前

    我强烈反对上述观点。也许是因为我讨厌用XML编写逻辑。所以两条评论都提到了 <data> 在Kotlin Android Extensions(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扩展工作得更好。我喜欢我的代码干净。你仍然可以同时使用这两种方法来做出决定。