当前位置: 首页 > 知识库问答 >
问题:

为什么在Kotlin中键入视图的名称/ID时会出现“未解析引用”错误?

祁烈
2023-03-14

我完全按照教程。我在android: id下的布局XML文件中为视图命名。当我用静态编程语言键入该名称时,它会以红色突出显示,并且有一个“未解决的引用”错误。

例如,在XML活动中。xml:

<TextView
    android:id="@+id/nameTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

在科特林主要活动。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 Extensions被弃用以来,我已经多次看到它的变体,但它们都有不同的措辞,而且不太容易搜索。我认为共同的因素是一个新的Android程序员遵循了一个在弃用之前编写的教程。这些教程通常不会指定所使用的功能被称为合成属性或Kotlin Android Extensions、合成视图属性或Kotlin Android Extensions,并且该功能已被弃用。

共有2个答案

田瀚
2023-03-14

不能直接访问视图ID。

但你可以使用:

>

  • Jetpack作为Kotlin Android扩展已被弃用。Source Kotlin Android Extensions Deprection

    可以使用视图绑定。视图绑定是一个允许您更轻松地编写与视图交互的代码的功能。在模块中启用视图绑定后,它会为该模块中存在的每个XML布局文件生成一个绑定类。来源:视图绑定

  • 杨良平
    2023-03-14

    通过静态编程语言中的ID/名称直接引用视图的能力称为“合成属性”,这是静态编程语言Android扩展项目插件的一项功能。

    谷歌和JetBrains决定反对Kotlin Android扩展,这意味着他们不再支持它,并阻止你使用它。自从它被弃用后,当你在Android Studio中创建一个新项目时,这个插件就不再包含在新项目中。因此,新项目中不支持合成属性,如果尝试使用它,将出现“未解决的引用”错误。

    2017年至2020年间编写的教程经常使用此功能,如果没有更新,他们甚至可能不会提到它的名字,因为它被认为是新项目中理所当然包含的插件。

    谷歌在这篇博文中解释了不推荐它的原因,主要原因如下:

    • 它们污染了全球名称空间
    • 它们不公开可空性信息
    • 它们只在Kotlin代码中工作

    获取视图引用的快捷方法是使用findviewbyd。视图类型应放在括号内

    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函数中的视图,因此必须在父视图中调用findviewbyd。(如果需要访问片段中的其他位置,请使用requireView()而不是view)。

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
    
        val nameTextView = view.findViewById<TextView>(R.id.nameTextView)
        //...
    }
    

    如果你只想完成在Kotlin Android Extensions被弃用之前编写的教程,findViewById可能是目前最好的选择。

    但是,使用findViewById可能会很乏味,而且很容易出错,因为如果搜索的视图不在当前布局中,它不会发出警告。如果这样做,它将在运行时崩溃。因此,谷歌建议使用视图绑定。开始使用视图绑定有几个步骤,但一旦设置好,它比findViewById更简洁。这里有官方指示。

    最后,如果你真的不在乎Kotlin Android Extensions被弃用,并且无论如何都想使用它,那么它目前仍然可以正常工作,但你必须将插件添加到新项目中才能启用它。为此,请打开构建。gradle文件,用于应用程序模块。在插件块的顶部,可以为kotlin android extensions添加一行代码,如下所示:

    plugins {
        id 'com.android.application'
        id 'kotlin-android'
        id 'kotlin-android-extensions'
    }
    

    然后按工具栏中的“用Gradle文件同步项目”按钮启用它。

     类似资料: