前言
最近看到一篇使用Kotlin委托属性来消除使用ViewBinding过程中样板代码的文章,觉得不错,因此翻译给大家,原文地址:
proandroiddev.com/make-androi…
正文
ViewBinding 是Android Studio 3.6中添加的一个新功能,更准确的说,它是DataBinding 的一个更轻量变体,为什么要使用View Binding 呢?答案是性能。许多开发者使用Data Binding库来引用Layout XML中的视图,而忽略它的其他强大功能。相比来说,自动生成代码ViewBinding其实比DataBinding 性能更好。但是传统的方式使用View Binding 却不是很好,因为会有很多样板代码(垃圾代码)。
View Binding 的传统使用方式
让我们看看Fragment 中“ViewBinding”的用法。我们有一个布局资源profile.xml
。View Binding 为布局文件生成的类叫ProfileBinding
,传统使用方式如下:
1 | 复制代码class ProfileFragment : Fragment(R.layout.profile) { |
有几点我不太喜欢:
- 创建和销毁
viewBinding
的样板代码 - 如果有很多Fragment,每一个都要拷贝一份相同的代码
viewBinding
属性是可空的,并且可变的,这可不太妙
怎么办呢?用强大Kotlin来重构它。
Kotlin 委托属性结合ViewBinding
使用Kotlin委托的属性,我们可以重用部分代码并简化任务(不明白委托属性的,可以看我(译者)以前的文章:一文彻底搞懂Kotlin中的委托),我用它来简化·ViewBinding的用法。用一个委托包装了
ViewBinding`的创建和销毁。
1 | 复制代码class FragmentViewBindingProperty<T : ViewBinding>( |
然后,使用我们定义的委托来重构ProfileFragment
:
1 | 复制代码class ProfileFragment : Fragment(R.layout.profile) { |
很好,我们去掉了创建和销毁ViewBinding的样板代码,现在只需要声明一个委托属性就可以了,是不是简单了?但是现在还有点问题。
问题来了
在重构之后,onDestroyView
需要清理掉viewBinding中的View。
1 | 复制代码class ProfileFragment() : Fragment(R.layout.profile) { |
但是,结果是,我得到的在委托属性内对ViewBinding的引用为null
。原因是Fragment的ViewLifecycleOwner
通知更新lifecycle的ON_DESTROY
事件时机,该事件发生在Fragment.onDestroyView()
之前。这就是为什么我仅在主线程上的所有操作完成后才需要清除viewBinding。可以使用Handler.post
完成。修改如下:
1 | 复制代码class FragmentViewBindingProperty<T : ViewBinding>( |
这样,就很完美了。
Android的新库ViewBinding是一个去掉项目中findViewByid()
很好的解决方案,同时它也替代了著名的Butter Knife
。ViewBinding 与Kotlin委托属性的巧妙结合,可以让你的代码更加简洁易读。完整的代码可以查看github:github.com/kirich1409/…
每天都有干货文章持续更新,可以微信搜索
「 技术最TOP 」
第一时间阅读,回复【思维导图】【面试】【简历】有我准备一些Android进阶路线、面试指导和简历模板送给你
本文转载自: 掘金