发布者:David Winer,产品经理
Android Kotlin Extensions Gradle 插件(不要和 Android KTX混淆)于 2017 年发布,为 Kotlin 的 Android 开发带来了两个新的便利功能。
Synthetics:让你用kotlinx.android.synthetic绑定来替换findViewById的调用。
Parcelize:让你可以去除模板,通过@Parcelize注解轻松创建Parcelables。
此后,我们发布了Android的Viewbinding,这是一个官方支持的库,与Android构建工具链深度集成,并提供了与Kotlin synthetics类似的功能。虽然我们继续推荐Parcelize,但使用Kotlin synthetics出现了一些缺点:
1. 会污染全局命名空间
2. 不会暴露可空性信息
3. 只能在Kotlin代码中工作
JetBrains 最初开发了 Android Kotlin Extensions 插件,我们一起讨论了继续维护综合体的利弊:我们努力确保在可能的情况下长期支持 API,但希望引导开发人员采用最佳实践,使代码库健康发展,最终使用户满意。
在未来一年的时间里,我们的团队将联合废止综合体,转而继续支持我们推荐的选项--View Binding。这意味着什么呢?
如果你在使用Parcelize,你可以继续使用相同的注解和API。然而,注释包将改为kotlinx.parcelize,并且在你的模块级Gradle文件中,你应该开始使用独立的kotlin-parcelize插件,而不是android-kotlin-extensions。你可以在Android开发者文档网站上找到Parcelize的文档。如果你使用的是Android Kotlin synthetics,你应该迁移到View Binding。查看我们的迁移指南,了解更多细节。
废弃期从今天发布的Kotlin 1.4.20开始。android-kotlin-extensions将在2021年9月期间或之后发布的Kotlin版本中删除。长期来看,我们将继续维护kotlin-parcelize插件,你可以继续在Android Studio问题跟踪器中提交关于Parcelize的问题。
官方回应原文:The future of Kotlin Android Extensions
前段时间自己升级了Kotlin最新版本,自己在项目中使用的KAE,AS sync给出了提示警告:The 'kotlin-android-extensions' Gradle plugin is deprecated. Please use this migration guide (https://goo.gle/kotlin-android-extensions-deprecation) to start working with View Binding (https://developer.android.com/topic/libraries/view-binding) and the 'kotlin-parcelize' plugin.
这段提示其实也应了官方给出的回答,以后直接废弃Kotlin Android Extensions 这个插件,将Viewbinding收揽到官方的API中,在很多场景下会慢慢代替findViewById。与使用 findViewById相比,Viewbinding具有一些很显著的优点:
@Nullable
标记。
Viewbinding功能可按模块启用。要在某个模块中启用视图绑定,请将viewbinding 元素添加到其build.gradle文件中,如下例所示:
android{...
buildFeatures {
viewBinding true
}
...
}
如果希望在生成绑定类时忽略某个布局文件,请将 tools:viewBindingIgnore="true"
属性添加到相应布局文件的根视图中:
...
添加 tools:viewBindingIgnore="true"此属性后,通过编译后,在AS 项目路径:app\build\generated\data_binding_base_classs_source_out\debug\out 中没有生成的viewbinding相关的文件
为某个模块启用Viewbinding功能后,系统会为该模块中包含的每个 XML 布局文件生成一个绑定类。每个绑定类均包含对根视图以及具有 ID 的所有视图的引用。系统会通过以下方式生成绑定类的名称:将 XML 文件的名称转换为驼峰式大小写,并在末尾添加“Binding”一词。
例如:你的项目MainActivity中的XML文件是activity_main.xml,启用Viewbinding并编译(make project)后在app\build\generated\data_binding_base_classs_source_out\debug\out \你的项目路径名称 中生成ActivityMainBinding.java文件。
如需设置绑定类的实例以供 Activity 使用,请在 Activity 的 onCreate()
方法中执行以下步骤:
inflate()
方法。此操作会创建该绑定类的实例以供 Activity 使用。getRoot()
方法或使用 Kotlin 属性语法获取对根视图的引用。setContentView()
,使其成为屏幕上的活动视图。class MainActivity : AppCompatActivity(), View.OnClickListener {
private lateinit var mViewbinding:ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mViewbinding= ActivityMainBinding.inflate(layoutInflater)
setContentView(mViewbinding.root)
}
初始化ActivityMainBinding后,就可以调用XML中使用Id标识的控件做他们该做的事了:
...
mViewbinding.btnJump.setBackgroundColor(R.color.design_default_color_background)
mViewbinding.btnJump.setOnClickListener(this)
...