Kotlin Android Extensions遭废弃,官方推荐使用ViewBinding

104 篇文章 29 订阅

在这里插入图片描述

https://youtrack.jetbrains.com/issue/KT-42121
As the @Parcelize functionality is extracted (KT-42120), the rest of the Android Extensions functionality can be deprecated in favour of View Binding.
The existing Android Extensions plugin will continue to work, however, a warning message will be shown.

记得曾经在《谁才是ButterKnife的终结者?》一文中大胆猜测ViewBinding将替代KAE,果然被不幸言中,近期KAE被正式废弃。

KAE的问题


KAE被废弃是因为存在以下几方面问题:

  • 类型安全:res下的任何id都可以被访问,有可能因访问了非当前Layout下的id而出错
  • 空安全:这主要体现在Configuration中的对应布局不全时,运行时可能出现NPE
  • 兼容性:只能在kotlin中使用,java不友好
  • 局限性:不能跨module使用

KAE被废的同时官方也给出了解决方案:迁移至ViewBinding。因为ViewBinding解决了KAE的主要缺陷:Null safety 与 Type safety,安全性更高。


ViewBinding的基本使用


开启ViewBinding很简单,只需在build.gradle中增加一下配置

android {
    ...
    buildFeatures {
        viewBinding true
    }
}

ViewBinding会在编译期根据layout文件生成对应的class

<LinearLayout ... >
        <TextView android:id="@+id/name" />
        <ImageView android:cropToPadding="true" />
        <Button android:id="@+id/btn"
            android:background="@drawable/rounded_button" />
</LinearLayout>

针对上面activity_main.xml,会生成ActivityMainBinding的class,

public final class ActivityMainBinding implements ViewBinding {
  @NonNull
  public final TextView name;

  @NonNull
  public final Button btn;

  @NonNull
  public View getRoot() {}
}

两个成员namebtn,分别对应layout中的TextView和Button。getRoot()方法返回layout的跟节点,上例中即LinearLayout

 <LinearLayout
        ...
        tools:viewBindingIgnore="true" >
        ...
</LinearLayout>

通过tools:viewBindingIgnore="true" 可以禁止ViewBinding的生成,所以class中没有ImageView对应的成员

在Activity中创建ViewBinding实例

private lateinit var binding: ActivityMainBinding

override fun onCreate (savedInstanceState: Bundle?) {
    super.onCreate (savedInstanceState)
    binding = ActivityMainBinding.inflate (layoutInflater)
    val view = binding.root
    setContentView (view)
}

并在适当的时候访问其成员

binding.name.text = viewModel.name
binding.btn.setOnClickListener {viewModel.userClicked ()}

Fragment中的使用

可以在Fragment的onCreateView中创建binding,然后在onDestroyView中销毁

override fun onCreateView (
    inflater: LayoutInflater,
    container: ViewGroup ?,
    savedInstanceState: Bundle?
): View? {
    _binding = ActivityMainBinding.inflate (inflater, container, false)
    val view = binding.root
    return view
}

override fun onDestroyView () {
    super.onDestroyView ()
    _binding = null
}
  • 10
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

fundroid

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

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

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

打赏作者

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

抵扣说明:

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

余额充值