我正在阅读关于MVVM架构如何工作以及如何使用Android数据绑定库帮助的文章。
总的来说,我理解Android数据绑定在UI层和保存要显示的信息的底层数据模型之间创建了一个链接。
Kotlin Android扩展是另一个Kotlin插件,它允许您从活动、片段和视图中恢复视图。该插件将生成一些额外的代码,允许您访问XML布局中的视图,就像它们是属性一样,具有在布局定义中使用的id的名称。
使用Android数据绑定库和Kotlin Android扩展有什么区别?它们是为了不同的目的吗?他们以什么方式互相补充?
谢谢你的回答。
发布于 2018-05-08 06:50:25
Kotlin扩展和都有助于消除findViewById的使用。
但也有更多的事情可以做,可以互相补充。为了详细说明,使用Android数据绑定库,您可以在xml文件中“设置”模型,然后可以直接利用这些模型为布局中的视图设置值。看见如何将<data>标记与数据绑定库一起使用。
Kotlin android扩展不提供这种功能。同时,Kotlin扩展提供了一些令人惊奇的特性,如@parcelize注释,使类可以在几乎没有样板代码的情况下进行打包,等等。
总之,虽然它们都消除了findViewById的使用,但它们也有自己的特性,可以很好地互补。
发布于 2019-01-13 23:03:51
Kotlin Android扩展并不代表只有视图绑定。它还包含其他特性。但是我想您是在讨论Kotlin Android扩展的视图绑定/缓存特性,并且怀疑我们是否仍然需要数据绑定,因为我们已经摆脱了带有Kotlin综合属性的findViewById调用。这就是我问自己的问题,我的结论是,是的,数据绑定仍然值得使用。
来自正式文件:
数据绑定库为布局…中具有ID的每个视图在绑定类中创建一个不可变字段库一次从视图层次结构中提取视图(包括ID)。这种机制可以比对布局中的每个视图调用findViewById()方法更快。
因此,数据绑定不会逐个调用视图上的findViewById。另一方面,Kotlin的合成类仍然在幕后视图上调用findViewById,但它只对每个视图调用一次,并缓存视图引用以供下一次调用。(这是一个关于它的文章 )
此外,数据绑定提供的不仅仅是查看缓存。您可以使用数据标记将数据传递到绑定实现并在xml中声明数据,而不是以编程方式设置它们。这样,您就可以摆脱用于填充数据的样板代码,比如“setText”、“setImageResource”等。您可以使用数据绑定从xml中设置事件侦听器。您还可以使用自定义绑定适配器生成自己的属性。当使用它的全部功能时,它可以显着地减少Java/Kotlin代码。
编辑:,似乎Google团队建议不要使用kotlin合成属性。这篇文章总结了围绕这个问题的讨论。你可以在谷歌准备的新Udacity课程中看到,他们按照推荐的做法使用数据绑定。
如果您不喜欢“将业务逻辑放在xml中”的想法,如果您对从xml中设置或获取数据不感兴趣,如果您只是想避免以一种安全有效的方式使用ViewDataBinding,那么可以使用库。它是数据绑定库的简化版本。它不允许您从xml中设置数据,但它以安全高效的方式绑定您的视图。
发布于 2019-03-25 16:42:55
我强烈不同意上述各点。也许是因为我讨厌用XML编写逻辑。因此,这两个评论都提到了在Kotlin扩展(KTX)中找不到的<data>标记的使用。使用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扩展工作得更好。我喜欢我的代码很干净。你仍然可以使用这两个决定是你做的。
https://stackoverflow.com/questions/50226081
复制相似问题