Ten*_*r04 5 xml android kotlin kotlin-android-extensions
我完全按照教程进行操作。我在 .xml 下的布局 XML 文件中为视图命名android:id。当我在 Kotlin 中输入该名称时,它会以红色突出显示,并且出现“未解析的引用”错误。
例如,在 XML Activity_main.xml中:
<TextView
android:id="@+id/nameTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
Run Code Online (Sandbox Code Playgroud)
在 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!
}
Run Code Online (Sandbox Code Playgroud)
我创建这个问题是因为自从 Kotlin Android 扩展被弃用以来,我已经多次看到它的变体,但它们的措辞方式多种多样,并且不太容易搜索。我认为共同的因素是新的 Android 程序员遵循弃用之前编写的教程。这些教程通常不会指定所使用的功能称为合成属性或Kotlin Android 扩展、合成视图属性或kotlin-android-extensions,并且该功能已被弃用。
在 Kotlin 中直接通过视图的 ID/名称引用视图的能力称为“合成属性”,它是名为Kotlin Android Extensions的项目插件的一项功能,该功能不再支持或包含在新项目中。(请参阅下面的解释。)
\n2017 年至 2020 年之间编写的教程经常使用此功能,如果它们尚未更新,他们可能甚至不会提及它的名称,因为它被理所当然地视为新项目中包含的插件。
\n需要考虑的一件事是,Jetpack Compose 正在成为在 Android 上执行 UI 的默认和推荐方式。您可能会考虑切换到教授该内容的教程,而不是传统的 XML 视图布局。但如果你仍然想学习传统观点:
\n获取视图参考的快速简便的方法是使用findViewById. 视图的类型应该放在括号内<>。在 Activity 中,它看起来像这样:
override fun onCreate(savedInstanceState: Bundle?) {\n super.onCreate(savedInstanceState)\n setContentView(R.layout.activity_main)\n \n val nameTextView = findViewById<TextView>(R.id.nameTextView)\n\n // Now you can refer to the view using the variable\n nameTextView.setText(R.string.hello_world)\n}\nRun Code Online (Sandbox Code Playgroud)\n在片段中,您可能会在函数中使用视图onViewCreated,因此您必须调用findViewById父视图。(如果您需要在片段中的其他位置访问它,请使用requireView()而不是view.
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n super.onViewCreated(view, savedInstanceState)\n\n val nameTextView = view.findViewById<TextView>(R.id.nameTextView)\n //...\n}\nRun Code Online (Sandbox Code Playgroud)\nfindViewById如果您只想完成在 Kotlin Android 扩展被弃用之前编写的教程,那么这可能是目前最好的选择。
然而,使用findViewById可能很乏味,而且也容易出错,因为如果您正在搜索不在当前布局中的视图,它不会警告您。如果这样做,它将在运行时崩溃。因此,Google 建议使用View Binding。开始使用视图绑定需要几个步骤,但是一旦设置好,它就会比findViewById. 官方说明在这里。
如果您的项目使用低于 1.8 的 Kotlin 版本,您可以通过将其添加到app模块文件的插件块中来启用它build.gradle:
override fun onCreate(savedInstanceState: Bundle?) {\n super.onCreate(savedInstanceState)\n setContentView(R.layout.activity_main)\n \n val nameTextView = findViewById<TextView>(R.id.nameTextView)\n\n // Now you can refer to the view using the variable\n nameTextView.setText(R.string.hello_world)\n}\nRun Code Online (Sandbox Code Playgroud)\n然后按工具栏中的“将项目与 Gradle 文件同步”按钮将其启用。
\n然而,许多用于 Android 开发的关键 Jetpack 库都使用较新版本的 Kotlin,这使得这是不可能的。
\nGoogle 和 JetBrains 决定弃用Kotlin Android Extensions,这意味着他们不再支持它,并阻止您使用它。
\n谷歌在这篇博文中解释了弃用它的原因,主要有以下几个原因:
\n\n\n\n
\n- 它们污染了全局命名空间
\n- 它们不暴露可空性信息
\n- 它们仅适用于 Kotlin 代码
\n
| 归档时间: |
|
| 查看次数: |
6742 次 |
| 最近记录: |