写点什么

Kotlin 插件的落幕,ViewBinding 的崛起,音视频开发工程师

用户头像
Android架构
关注
发布于: 刚刚
  • 包含了 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 库的示例。



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


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


cle)


}

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Kotlin 插件的落幕,ViewBinding 的崛起,音视频开发工程师