kotlin学习笔记 20210419

  • 废弃了 kotlin-android-extensions 编译插件
  • Parcelable 相关的功能,移到了新的插件 kotlin-parcelize

ViewBinding 和 DataBinding

ViewBinding:

  • 仅仅支持绑定 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 文件生成绑定类。

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
    }
}

在模块级 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")
        }
    }
}

一行代码实现 DataBinding 和 ViewBinding

将下列代码添加在模块级 build.gradle 文件内,并且需要开启 DataBinding 或者 ViewBinding

dependencies {
    implementation 'com.hi-dhl:binding:1.0.5'
}

在 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)
}

在 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()
}

Binding库具有以下优点:

  • 可以在 Activity 、AppCompatActivity 、FragmentActivity 、Fragment 、Dialog、Adapter、Navigaio 中的使用 DataBinding 或者 ViewBinding
  • 避免模板代码,只需要一行代码即可实现 DataBinding 或者 ViewBinding
  • 具有生命周期感知,当生命周期处于 onDestroyed() 时会自动销毁数据

如何迁移 Parcelable

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呼唤2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值