Kotlin 插件的落幕,ViewBinding 的崛起

本文讲述了KotlinAndroid开发中废弃kotlin-android-extensions插件中的Parcelable相关功能,转向kotlin-parcelize。介绍了Synthetic视图的优缺点,以及ViewBinding和DataBinding的对比,强调了使用委托属性简化模板代码的重要性,以及Binding库的未来规划。
摘要由CSDN通过智能技术生成

简单总结一下,主要有以下几点:

  • 废弃了 kotlin-android-extensions 编译插件

  • Parcelable 相关的功能,移到了新的插件 kotlin-parcelize

按照 Google 的解释,kotlin-android-extensions 插件只会保留至少一年的时间,将会在 2021 年 9 月或之后的 Kotlin 版本中将被移除

kotlin-android-extensions 主要有以下两个功能:

  • 使用 Kotlin 合成方法(Synthetic 视图)取代 findViewById,通过引入 kotlinx.android.synthetic 可以直接使用控件的 ID,我猜当初也是因为这个特性,吸引了很多开发者开始学习和尝试使用 Kotlin

  • 手动实现 Parcelize 比较麻烦,所以 Kotlin 提供了 @Parcelize 注解帮助快速实现 Parcelize

其实这并不是什么新的新闻了,早在 2019 年的时候,Google 就提出了不建议在项目中使用 kotlinx.android.synthetic,详见这个 commit,部分内容如下图所示:

Kotlin 插件的落幕,ViewBinding 的崛起

通过引入 kotlinx.android.synthetic 可以直接使用控件的 ID,这么方便为什么不建议使用?主要有以下问题:

  • 通过 Kotlin 合成方法(Synthetic 视图)取代 findViewById,这是通过全局空间缓存 ID,与 Layout 无关,没有针对 ID 进行无效检查

  • 在不同的 Layout 文件中,使用了相同的 ID,或者删除了 ID ,它并不会提示空异常,导致增加了 App 的崩溃次数

  • 仅仅支持 Kotlin

  • 默认是通过 HashMap 缓存 ID 浪费空间,虽然可以通过在模块级 build.gradle 文件内添加 defaultCacheImplementation = “SPARSE_ARRAY” 来修改默认的实现方式为 SparseArray

因此 ViewBinding 出现了,ViewBinding 解决了上述所有问题,ViewBinding 虽然好,但是也有它的不足之处。

  • ViewBinding 相比于 kotlinx.android.synthetic 使用方式比较复杂

  • 在 Activity 、 Fragment 、Dialog 、 Adapter 中 ViewBinding 和 DataBinding 初始化方式有些不同

  • 需要单独处理 include 带 merge 标签的布局,和不带 merge 标签的布局等等

  • DataBinding 结合 LiveData 一起使用需要做单独的处理

无论 ViewBinding 和 DataBinding 它们的使用方式都比较复杂,稍后我会介绍一种方法,只需要一行代码即可使用 ViewBinding(视图绑定) 和 DataBinding(数据绑定),那么 ViewBinding 和 DataBinding 有什么区别呢?

ViewBinding 和 DataBinding

=========================

ViewBinding:

  • 仅仅支持绑定 View

  • 不需要在布局文件中添加 layout 标签

  • 需要在模块级 build.gradle 文件中添加 viewBinding = true 即可使用

  • 效率高于 DataBinding,因为避免了与数据绑定相关的开销和性能问题

  • 相比于 kotlin-android-extensions 插件避免了空异常

DataBinding:

  • 包含了 ViewBinding 所有的功能

  • 需要在模块级 build.gradle 文件内添加 dataBinding = true 并且需要在布局文件中添加 layout 标签才可以使用

  • 支持 data 和 view 双向绑定

  • 效率低于 ViewBinding,因为注释处理器会影响数据绑定的构建时间。

ViewBinding 可以实现的, DataBinding 都可以实现,但是 DataBinding 的性能低于 ViewBinding,DataBinding 和 ViewBinding 会为每个 XML 文件生成绑定类。

R.layout.activity_main -> ActivityMainBinding

R.layout.fragment_main -> FragmentMainBinding

R.layout.dialog_app -> DialogAppBinding

从 Android Studio 3.6 版本开始,就内置在 Gradle 插件中了,不需要添加任何额外的库来使用它们,但是在 Android Studio 3.6 和 Android Studio 4.0 中使用方式不一样。

// Android Studio 3.6

android {

viewBinding {

enabled = true

}

dataBinding{

enabled = true

}

}

// Android Studio 4.0

android {

buildFeatures {

dataBinding = true

viewBinding = true

}

}

接下来我们看一下如何在项目中使用 DataBinding 和 ViewBinding,因文章篇幅原因,这里仅仅演示在 Activity 中使用,更多用法可以查看 Binding 库的示例。

Kotlin 插件的落幕,ViewBinding 的崛起

在模块级 build.gradle 文件内 开启 DataBinding 或者 ViewBinding 之后,需要在 Activity 中进行初始化,获取到 ViewBinding 实例即可使用。

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

// Viewbinding

val binding: ActivityMainBinding = ActivityMainBinding.inflate(layoutInflater)

// DataBinding

// val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)

with(binding){

textView.setText(“Binding”)

}

}

}

如果在每个 Activity 中都需要添加 ActivityMainBinding.inflate() 或者 DataBindingUtil.setContentView() 方法来进行初始化,这样无疑增加了很多模板代码,不仅仅是 Activity 在 Fragment 、Dialog 、Adapter 中都需要添加对应的方法来初始化。

那么能不能用一种方法,可以统一这些初始化方案,在 Kotlin 中是可以实现的,仅仅需要一行代码即可实现 DataBinding 和 ViewBinding。

一行代码实现 DataBinding 和 ViewBinding

================================

如果在每个 Activity 、 Fragment 、Dialog 、 Adapter 中都需要手动来添加相同的方法来初始化,这样的成本是非常大的,所以我们结合 Kotlin 委托属性,简化模板代码。

因此我推出了一个新库 Binding ,Binding 简化 DataBinding 和 ViewBinding 的使用, 只需要一行代码即可实现 DataBinding 和 ViewBinding,他们的实现方式并不相同。

Binding 未来的规划提供通用的 findViewById 解决方案,因技术的迭代更新从 butterknife 、 DataBinding 、 Kotlin 合成方法(Synthetic 视图)到现在 ViewBinding , 未来也有可能出现新的技术,无论技术怎么变化,只需要更新 Binding ,对外的使用保持不变。我们来看一下如何在项目中使用 Binding 库。

  • 将下列代码添加在模块级 build.gradle 文件内,并且需要开启 DataBinding 或者 ViewBinding

dependencies {

implementation ‘com.hi-dhl:binding:1.0.4’

}

  • 在 Adapter(ListAdapter、PagingDataAdapter、RecyclerView.Adapter 等等)中使用 DataBinding 和 ViewBinding,添加 by viewbind() 或者 by databind() 即可,示例如下所示,查看详细示例

class ProductViewHolder(view: View) : RecyclerView.ViewHolder(view) {

// 通过 DataBinding 绑定的 itemView

val binding: RecycleItemProductBinding by databind()

fun bindData(data: Product?, position: Int) {

binding.apply {

product = data

executePendingBindings()

}

}

}

class ProductViewHolderHeader(view: View) : RecyclerView.ViewHolder(view) {

// ViewBinding

val binding: RecycleItemProductHeaderBinding by viewbind()

fun bindData(data: Product?, position: Int) {

binding.apply {

name.text = “通过 ViewBinding 绑定的 head”

}

}

}

  • 在 Activity 、AppCompatActivity 、FragmentActivity 中使用,继承对应的类添加 by viewbind() 即可如下所示。

class MainActivity : AppCompatActivity() {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

代码真的是重质不重量,质量高的代码,是当前代码界提倡的,当然写出高质量的代码肯定需要一个相当高的专业素养,这需要在日常的代码书写中逐渐去吸收掌握,谁不是每天都在学习呀,目的还不是为了一个,为实现某个功能写出高质量的代码。

所以,长征路还长,大家还是好好地做个务实的程序员吧。

最后,小编这里有一系列Android提升学习资料,有兴趣的小伙伴们可以来看下哦~

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

😕/img2.imgtp.com/2024/03/13/H4lCoPEF.jpg" />

最后

代码真的是重质不重量,质量高的代码,是当前代码界提倡的,当然写出高质量的代码肯定需要一个相当高的专业素养,这需要在日常的代码书写中逐渐去吸收掌握,谁不是每天都在学习呀,目的还不是为了一个,为实现某个功能写出高质量的代码。

所以,长征路还长,大家还是好好地做个务实的程序员吧。

最后,小编这里有一系列Android提升学习资料,有兴趣的小伙伴们可以来看下哦~

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 20
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值