我正在严格遵循教程。我在布局 XML 文件中的
android:id
下为视图命名。当我在 Kotlin 中输入该名称时,它会以红色突出显示,并且出现“未解析的引用”错误。
例如,在 XML 中activity_main.xml:
<TextView
android:id="@+id/nameTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
在 Kotlin 中 MainActivity.kt:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
nameTextView // <-- This is highlighted red with error so I can't use it!
}
我创建这个问题是因为自从 Kotlin Android 扩展被弃用以来,我已经多次看到它的变体,但它们的措辞方式多种多样,并且不太容易搜索。我认为共同的因素是新的 Android 程序员遵循弃用之前编写的教程。这些教程通常不会指定所使用的功能称为“合成属性”或“Kotlin Android 扩展”、“合成视图属性”或“kotlin-android-扩展”,并且该功能已被“弃用”。 在 Kotlin 中直接通过 ID/名称引用视图的能力称为“合成属性”,它是名为 Kotlin Android Extensions 的项目插件的一项功能,该功能不再支持或包含在新项目中。 (请参阅下面的解释。) 2017 年至 2020 年之间编写的教程经常使用此功能,如果它们尚未更新,他们可能甚至不会提及它的名称,因为它被理所当然地视为新项目中包含的插件。
如何解决问题
获取视图参考的快速简便方法是使用 findViewById
<>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val nameTextView = findViewById<TextView>(R.id.nameTextView)
// Now you can refer to the view using the variable
nameTextView.setText(R.string.hello_world)
}
在片段中,您可能会在
onViewCreated
函数中使用视图,因此您必须在父视图上调用
findViewById
。 (如果您需要在片段中的其他位置访问它,请使用 requireView()
而不是 view
。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val nameTextView = view.findViewById<TextView>(R.id.nameTextView)
//...
}
如果您只想完成在 Kotlin Android 扩展被弃用之前编写的教程,
findViewById
可能是目前最好的选择。但是,使用 findViewById
可能很乏味,而且也容易出错,因为如果您正在搜索不在当前布局中的视图,它不会警告您。如果这样做,它将在运行时崩溃。因此,Google 建议使用View Binding。开始使用视图绑定需要几个步骤,但是一旦设置好,它就会比
findViewById
更简洁。官方说明
在这里.
如果我仍然想使用 Kotlin Android 扩展怎么办?如果您的项目使用低于 1.8 的 Kotlin 版本,您可以通过将其添加到
app
模块的
build.gradle
文件的插件块来启用它:
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-android-extensions'
}
但是,许多用于 Android 开发的关键 Jetpack 库都使用较新版本的 Kotlin,这使得这是不可能的。 为什么不再支持?Google 和 JetBrains 决定弃用
Kotlin Android 扩展
,这意味着他们不再支持它,并阻止您使用它。Google 在这篇博文
中解释了弃用它的原因,主要有以下几个原因:它们污染了全局命名空间 它们不会公开可空性信息
Kotlin Android 扩展弃用Jetpack 作为 Kotlin Android 扩展已被弃用。来源
- 您无法直接访问视图 ID。
- 但是你可以使用: