那么,使用Android数据绑定库和Kotlin Android Extensions之间有什么区别?它们是否用于不同的目的?它们如何相互补充?
谢谢您的回答。
Kotlin Android Extensions 不仅代表视图绑定。它还包含其他功能。但我想你在谈论 Kotlin Android Extensions 的视图绑定/缓存功能,并想知道我们是否仍然需要数据绑定,因为我们已经通过 Kotlin 的合成属性摆脱了 findViewById 调用。这是我问自己的问题,我的结论是,是的,仍然值得使用数据绑定。
根据官方文档:
数据绑定库会为布局中每个具有 ID 的视图创建一个不可变字段...该库会在单次遍历中从视图层次结构中提取包括 ID 在内的视图。这种机制可能比对布局中每个视图调用 findViewById() 方法要快。
因此,数据绑定不会逐个调用视图上的findViewById。另一方面,Kotlin 的合成类在幕后仍会在视图上调用 findViewById,但仅对每个视图调用一次,并缓存视图引用以供下一次调用。(这是一篇关于此的文章)
此外,数据绑定不仅可以用于视图缓存。您可以使用数据标记将数据传递给绑定实现并在xml中声明它们,而不是通过编程方式设置它们。这样,您就可以摆脱用于填充数据的样板代码,例如 "setText"、 "setImageResource" 等。您可以使用数据绑定从xml设置事件监听器。您还可以使用自定义绑定适配器来创建自己的属性。当充分利用其功能时,它可以显著减少 Java/Kotlin 代码量。编辑2:如果您不喜欢“在xml中加入业务逻辑”的想法,如果您对设置或从xml获取数据不感兴趣,如果您只是想以安全有效的方式避免使用findViewByIds,则可以选择使用ViewDataBinding库。它是数据绑定库的简化版本。它不允许您从xml设置数据,但可以以安全有效的方式绑定视图。
Kotlin Android Extensions和Android Data Binding Library都有助于消除对findViewById
的使用。
但是它们都有更多的功能,可以相互补充。具体来说,使用Android Data Binding库,您可以在xml文件中“设置”模型,然后直接利用这些模型为布局中的视图设置值。请参阅如何通过数据绑定库使用<data>
标签。
Kotlin android extensions没有提供此功能。与此同时,Kotlin android extensions提供了一些令人惊叹的功能,例如@parcelize
注释,使类可以轻松地进行序列化而无需编写样板代码等。
总之,虽然它们都消除了对findViewById
的使用,但它们也拥有自己的特色功能,可以很好地相互补充。
<data>
标签的使用。使用Kotlin和KTX,您可以比data标签做得更好。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扩展效果更好。我喜欢我的代码整洁。您仍然可以使用两者,决定权在您手中。