Kotlin 插件的落幕,ViewBinding 的崛起,android适配问题

}

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

Kotlin 插件的落幕,ViewBinding 的崛起,android适配问题

在模块级 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() {

// DataBinding

val binding: ActivityMainBinding by databind(R.layout.activity_main)

// ViewBinding

val binding: ActivityMainBinding by viewbind()

}

  • 在 Fragment 中使用方式如下所示。

class MainFragment : Fragment(R.layout.fragment_main) {

// DataBinding

val binding: FragmentMainBinding by databind()

// ViewBinding

val binding: FragmentMainBinding by viewbind()

}

  • 在 Dialog 中使用方式如下所示。

class AppDialog(context: Context) : Dialog(context, R.style.AppDialog) {

val binding: DialogAppBinding by viewbind()

}

添加具有生命周期感知的 Dialog

class AppDialog(context: Context,lifecycle: Lifecycle) : Dialog(context, R.style.AppDialog) {

val binding: DialogAppBinding by viewbind(lifecycle)

}

更多详细的用法,可以前去仓库 Binding 查看,Binding 具有以下优点:

  • 可以在 Activity 、AppCompatActivity 、FragmentActivity 、Fragment 、Dialog 、 ListAdapter 、 PagingDataAdapter 、 RecyclerView.Adapter 中的使用 DataBinding 或者 ViewBinding

  • 简单的 API 只需要一行代码即可实现 DataBinding 或者 ViewBinding

  • 避免大量的模板代码

  • 避免内存泄露,具有生命周期感知能力,当生命周期处于 onDestroyed() 时会自动销毁数据

源码分析,将会在后续的文章中分享,如果这个仓库对你有帮助,请在仓库右上角帮我 star 一下,非常感谢。

如何迁移 Parcelable

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

Kotlin 将 Parcelable 相关的功能,移到了新的插件 kotlin-parcelize,迁移只需要两步,如下所示。

  • 在模块级 build.gradle 文件中,将 kotlin-android-extensions 修改为 kotlin-parcelize

Kotlin 插件的落幕,ViewBinding 的崛起,android适配问题

  • 将 import kotlinx.android.parcel.Parcelize 修改为 import kotlinx.parcelize.Parcelize 但是这一步不是必须的,kotlinx.android.parcel.Parcelize 可以继续使用,到目前为止还没有发现什么问题(PS: 如果出现,只需要将包名替换就好)

结语

==

文章中相关代码,已经上传到 GitHub 欢迎前去仓库 Binding 查看

Binding 地址:https://github.com/hi-dhl/Binding

感谢 Simple one-liner ViewBinding in Fragments and Activities with Kotlin 文章带来的思路,以及从 Anko 、和 ViewBindingDelegate 等等开源库中学习到技巧。

陆陆续续有一些小伙伴们问我在哪里,可以看一些国外技术文章,所以我也给大家总结了一些不错的网站。

Kotlin 插件的落幕,ViewBinding 的崛起,android适配问题

最后

由于题目很多整理答案的工作量太大,所以仅限于提供知识点,详细的很多问题和参考答案我都整理成了 PDF文件

Kotlin 插件的落幕,ViewBinding 的崛起,android适配问题

Kotlin 插件的落幕,ViewBinding 的崛起,android适配问题

Kotlin 插件的落幕,ViewBinding 的崛起,android适配问题

lin 插件的落幕,ViewBinding 的崛起](https://www.icode9.com/i/ll/?i=img_convert/122c03777330a0fd4669e99348133db4.png)

最后

由于题目很多整理答案的工作量太大,所以仅限于提供知识点,详细的很多问题和参考答案我都整理成了 PDF文件

[外链图片转存中…(img-9cmcgF5T-1643532697645)]

[外链图片转存中…(img-T50GMtUk-1643532697646)]

[外链图片转存中…(img-40rvcwbH-1643532697646)]

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

上一篇:ViewBinding简单使用


下一篇:2021-10-02