}

接下来我们看一下如何在项目中使用 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(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

  • 将 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 等等开源库中学习到技巧。

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

最后

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

lin 插件的落幕,ViewBinding 的崛起](https://img-blog.csdnimg.cn/img_convert/122c03777330a0fd4669e99348133db4.png)

最后

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

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

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

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

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

Kotlin 插件的落幕,ViewBinding 的崛起,android适配问题相关推荐

  1. bean json转kotlin_Android kotlin插件神器Json直接生成javaBean

    这是一个data class从JSON字符串生成Kotlin 的插件,换句话说,是一个将JSON字符串转换为Kotlin data class(Json到Kotlin)的插件 在使用Kotlin进行开 ...

  2. 巨人的崛起 Android操作系统发展历程

    巨人的崛起 Android操作系统发展历程 ugmbbc发布于 2011-10-19 06:58:28|10725 次阅读 字体:大 小 打印预览       今天我们来聊一聊Android系统的历史 ...

  3. Eclipse安装Kotlin插件后,新建找不到Kotlin文件

    1.安装Kotlin插件 2.搜索框搜索Kotlin,并安装.显示installed为安装成功. 3.此时在项目新建中是找不到Kotlin文件的 4.右键右上角小图标,点击"定制" ...

  4. uniapp 原生安卓开发插件(module),以及android环境本地调试(一)

    uniapp 原生安卓开发插件(module),以及android环境本地调试 1.开发前景 由于uniapp 框架的局限先,有很多功能不能如原生android开发使用顺畅,因此,需要使用插件进行辅助 ...

  5. Chrome浏览器免插件更改Ua模拟iOS和Android等教程,附QQ和微信

    Chrome浏览器免插件更改Ua模拟iOS和Android等教程,附QQ和微信 .. http://www.zuanke8.com/thread-1798313-1-1.html (出处: 赚客吧) ...

  6. ss+android插件安装,主程序接入指南-RePlugin - Android插件化方案-面试哥

    只需三步,就能让您的"主程序"接入RePlugin: 注意:目前有开发同学反馈,开启Instant Run时可能会出现运行时异常情况,请临时关掉此功能后再试.需要重新编译和安装之前 ...

  7. 【Android】Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法

    Android适配器之ArrayAdapter.SimpleAdapter和BaseAdapter的简单用法与有用代码片段 ArrayAdapter.SimpleAdapter和BaseAdapter ...

  8. android ui布局适配,Android适配全面总结(一)----屏幕适配

    前言 Android适配是一个老生常谈的问题,很多程序员觉得很恶心,不愿意做适配,但是又不得不做.然后老板说,这位兄弟,做好了,今天晚饭给你加个鸡腿,然后程序员开始找各种资料,忙活起来了,最终在苦逼的 ...

  9. Android 适配(一)

    一.Android适配基础参数 1.常见分辨率(px) oppx 2340x1080 oppR15 2280x1080 oppor11sp 2160*1080 1080*1920 (主流屏幕16:9) ...

最新文章

  1. 一文带你搞懂 MySQL 分区!
  2. labview叠加白噪声_强化学习中Ornstein-Uhlenbeck噪声是鸡肋吗?
  3. 3变量程序_PLC的程序结构及其特点
  4. 解决thymeleaf报错 $ is not defined
  5. 1.2 决策树代码实现
  6. 马哥linux高薪中级-DNS
  7. JAVA入门级教学之(对象和引用)
  8. 打通JAVA与内核系列之一ReentrantLock锁的实现原理
  9. 前端技术之_CSS详解第三天
  10. 把杀某程序封装成sh
  11. cocos2d-x常用工具-沈大海cocos2d-x教程23
  12. 高分辨率下应用程序显示模糊的解决办法
  13. 「Algospot」龙曲线DRAGON
  14. FreeSWITCH实现在视频通话中某一方视频翻转
  15. java中到底该不该用@author标识作者?
  16. HDU 5442 后缀自动机(从环字符串选定一个位置 , 时针或顺时针走一遍,希望得到字典序最大)...
  17. 和风天气获取天气情况
  18. 计算机的录像功能在哪里找,电脑录像功能在哪
  19. 【第148期】游戏策划:恭喜@灯入职剧情策划
  20. 发那科机器人请关闭电源_发那科FANUC机器人报警处理(中文)

热门文章

  1. MySQL数据库常用查询(带练习示例)
  2. 范仲淹写苏州名胜的诗篇
  3. Shiro的简单入门(一)
  4. HBase原理–所有Region切分的细节都在这里了
  5. 单片机 c语言 可控硅,单片机控制可控硅电路
  6. 谷粒商城分布式基础篇1-个人版
  7. deepfacelab应用报错原因和解决办法
  8. linux识别硬盘位置,Linux下读取硬盘的smart信息
  9. 系统调优之四大天王——快来瞧瞧~
  10. php 进程通信系列 (三)信号量