实在这并不是什么新的消息了,早在 2019 年的时间,Google 就提出了不发起在项目中利用 kotlinx.android.synthetic,详见这个 commit ,部门内容如下图所示:
通过引入 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 相比于 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插件制止了空非常
仅仅支持绑定 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 文件天生绑定类。
从 Android Studio 3.6版本开始,就内置在 Gradle 插件中了,不必要添加任何额外的库来利用它们,但是在 Android Studio 3.6和 Android Studio 4.0中利用方式不一样。
//Android Studio 4.0android{buildFeatures{dataBinding= trueviewBinding= true}}
接下来我们看一下如安在项目中利用 DataBinding 和 ViewBinding,因文章篇幅缘故原由,这里仅仅演示在 Activity 中利用,更多用法可以检察 Binding 库中的示例。Binding 地点: http://github.com/hi-dhl/Binding
在模块级 build.gradle文件内开启 DataBinding 大概 ViewBinding 之后,必要在 Activity 中举行初始化,获取到 ViewBinding 实例即可利用。
overridefunonCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)
// Viewbindingvalbinding: 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 委托属性,通过反射 inflate方法获取到 ViewBinding 实例,如许就可以直接利用 ID 了。
因此 Binding 库出现了,只必要一行代码即可实现 DataBinding 和 ViewBinding,这个库最初的思绪源于 Simple one-liner ViewBinding in Fragments and Activities with Kotlin ,我们来看一下如安在项目中利用 Binding 库。
- 将下列代码添加在模块级 build.gradle 文件内,而且必要开启 DataBinding 大概 ViewBinding
添加具有生命周期感知的 Dialog
- 在 Activity 、 AppCompatActivity 、 FragmentActivity 中利用,继续对应的类添加 by viewbind 即可如下所示。
在 Fragment中利用方式如下所示。
Binding 库具有以下长处:
- 可以在 Activity 、 AppCompatActivity 、 FragmentActivity 、 Fragment 、 Dialog 中的利用 DataBinding 大概 ViewBinding
- 制止模板代码,只必要一行代码即可实现 DataBinding 大概 ViewBinding
- 具有生命周期感知,当生命周期处于 onDestroyed 时会主动烧毁数据
源码分析,将会在后续的文章中分享 。
怎样迁徙 Parcelable
Kotlin 将 Parcelable相干的功能,移到了新的插件 kotlin-parcelize,迁徙只必要两步,如下所示。
在模块级 build.gradle文件中,将 kotlin-android-extensions修改为 kotlin-parcelize
- 将 import kotlinx.android.parcel.Parcelize 修改为 import kotlinx.parcelize.Parcelize 但是这一步不是必须的, kotlinx.android.parcel.Parcelize 可以继承利用,到现在为止还没有发现什么题目 (PS: 假如出现,只必要将包名更换就好)
结语
文章中相干的示例,已经上传到 GitHub 接待前往堆栈 Binding检察。Binding 地点: http://github.com/hi-dhl/Binding
感谢 Simple one-liner ViewBinding in Fragments and Activities with Kotlin文章带来的思绪,以及从 Anko、和 ViewBindingDelegate等等开源库中学习到本领。
检察更多开辟者出色分享
"开辟者说·DTalk" 面向中国开辟者们征集 Google 移动应用 (apps & games) 相干的产物/技能内容。接待各人前来分享您对移动应用的行业洞察或看法、移动开辟过程中的心得或新发现、以及应用出海的实战履历总结和相干产物的利用反馈等。我们由衷地盼望可以给这些出众的中国开辟者们提供更好显现本身、充实发挥本身专长的平台。我们将通过各人的技能内容偏重选出良好案例举行谷歌开辟技能专家 (GDE) 的保举。 返回搜狐,检察更多