使用Gradle版本6.2和Android Studio版本4.0.1时,我收到了有关 Kotlin-android-extention
的弃用消息。是否有人知道如何修复它?
使用Gradle版本6.2和Android Studio版本4.0.1时,我收到了有关 Kotlin-android-extention
的弃用消息。是否有人知道如何修复它?
根据谷歌文档,Kotlin Android Extensions已经被弃用。
Kotlin Android Extensions已经被弃用,这意味着不再支持使用Kotlin合成来进行视图绑定。
对于那些想知道什么是synthetic
的人,我应该说,使用Kotlin可以通过在Gradle
中添加'kotlin-android-extensions'
来实现访问UI视图ID的简单方式。
'kotlin-parcelize'
代替'kotlin-android-extensions'
。现在已经过时
从插件中删除'Kotlin-android-extensions'
。(用于Kotlin合成方式访问UI元素)
添加以下内容以使用view binding
方式访问UI元素。
android {
...
buildFeatures {
viewBinding true
}
}
如果您的应用程序包含 Parcelable
,请添加'kotlin-parcelize'
插件,以使用一种简单的方式通过将@Parcelize
注释添加到类来创建可包裹对象。
您可以查看Google指南了解此更新的详细信息。
由于"kotlin-android-extensions"现已弃用,因此最好使用视图绑定。
为此,请在build.gradle文件中的android块下编写以下代码以启用视图绑定。
buildFeatures {
viewBinding true
}
然后在活动文件中使用视图绑定功能
首先声明一个全局变量用于绑定,如下:
private lateinit var binding:ActivityMainBinding
这里的ActivityMainBinding是一个自动生成的类
然后在OnCreate()方法中编写以下代码
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
以上答案是正确的,但是如果你从项目中删除 'kotlin-android-extensions',那么使用kotlin的合成方式访问视图属性就不可能了,所以你需要迁移到使用view binding,按照Google的这篇指南进行迁移: 链接
android {
...
buildFeatures {
viewBinding true
}
}
如已经声明的那样,Kotlin Synthetics已被弃用,应该被View Binding替代。在我的情况下,我想引入View Binding并逐渐从Kotlin Synthetics迁移。在一个项目中可以同时使用两者,只需要记住不要更新Kotlin版本 - 我在4.1.21
上遇到了构建错误,所以需要降级到1.4.10
。
还要记得从已经迁移到使用View Binding的类(通常是activity/fragment)中删除Kotlin Synthetics导入。
android {
buildFeatures {
viewBinding true
}
}
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
}
致
binding.objectID.text = "Text "
android {
...
buildFeatures {
viewBinding true
}
}
private lateinit var binding: FragmentHomeBinding
private lateinit var viewModel: HomeViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = FragmentHomeBinding.inflate(layoutInflater)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
viewModel = ViewModelProvider(this)[HomeViewModel::class.java]
binding = FragmentHomeBinding.inflate(inflater, container, false)
binding.txtVw.text = menuItem.title
binding.imgVwIcon.setImageResource(menuItem.iconId)
return binding.root
}
}