繁体   English   中英

kotlin 中带有 id 和 activity_main 的未解决引用

[英]Unresolved reference in kotlin with id and activity_main

我实际上是在 kotlin 中创建一个新应用程序,以在带有格式化信息的框中显示 xml 文件

问题是当我构建应用程序时,有一个 activity_main,返回“未解决的引用”的 id

Unresolved reference: id
Unresolved reference: id

这里是 MainActivity.kt

package com.example.instantsystem

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.ArrayAdapter
import android.widget.ListView
import java.io.IOException

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val listView = findViewById<ListView>(id.listView)
        var employees: List<Employee>? = null
        try {
            val parser = XmlPullParserHandler()
            val istream = assets.open("employees.xml")
            employees = parser.parse(istream)

            val adapter = ArrayAdapter(this, R.layout.simple_list_item_1, employees)
            listView.adapter = adapter

        } catch (e: IOException) {
            e.printStackTrace()
        }
    }
}

这里是 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.instantsystem.MainActivity">

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

    </ListView>

</android.support.constraint.ConstraintLayout>

我不明白错误,我导入了package并在xml中定义了它。我的代码有什么问题?

在我的情况下,删除import android.R解决了这个问题。

从可能自动导入的导入中删除import android.R

build.gradle (Module..) 内需要应用最新版本kotlin-android-extensions

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

@SkorpEN 提到的相同,对我来说,还删除了import android.R解决了这个问题。

The reason why import android.R added from nowhere is, if you paste a java code into Kotlin it will convert to Kotlin automatically and some times this import android.R will also be added automatically.

就我而言,我不小心删除了 package 声明,因此添加package your.package.name为我修复了它。

使用 Kotlin Android 扩展,您不再需要调用findViewById() 就像这样:

import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        var employees: List<Employee>? = null
        try {
            val parser = XmlPullParserHandler()
            val istream = assets.open("employees.xml")
            employees = parser.parse(istream)

            val adapter = ArrayAdapter(this, R.layout.simple_list_item_1, employees)
            listView.adapter = adapter  // here, the listView variable name refers to the id given in the xml file

        } catch (e: IOException) {
            e.printStackTrace()
        }
    }
}

SkorpEN 所述,在大多数情况下,删除导入 Android.R 将起作用。

如果找不到该导入,请尝试检查 Activity 顶部的 package 名称。 如果没有 package 名称,请添加 package 名称,或者如果名称已经存在,请尝试删除该行并重写名称。

更改此行

val listView = findViewById<ListView>(id.listView)

对此

val listView = findViewById<ListView>(R.id.listView)

您缺少 R 参考。

在尝试重命名我的应用程序名称以及包和文件夹后,它发生在我身上。 确保在代码中搜索所有旧名称并将其替换为新名称。

就我而言; 我在自动导入中编辑了MainActivity.kt代码,所以我必须添加:

import com.package.name.R 

我的代码中没有要删除的import android.R ,我已经在 MainActivity.kt 中声明了我的 package

更新 Android Gradle 插件对我有用

在 Rebuild Project 和 Make Project 失败后,最后 Clean Project 为我工作。 (记得事先添加插件, kotlin-android-extensions 。)

如果 AndroidManifest.xml 的 package 名称错误,就会发生这种情况。

由于上述答案均不适合我,因此我找到了另一个有效的解决方案:将 package 名称添加到R

例如,从此更改:

onView(withId(R.id.llDirectionsButtonImageView)).perform(click())

对此:

onView(withId(com.myco.appsdk.R.id.llDirectionsButtonImageView)).perform(click())

就我而言,问题发生在多模块项目的 Espresso 测试代码中。 一个模块,appsdk,包含所有的 UI 代码和资源文件。 另一个模块 app 基于 appsdk 创建一个Application并在该应用程序上运行 Espresso 测试。 出于这个原因,我认为app模块中的Espresso测试代码需要引用appsdk中的资源ID,并具有完全限定的名称。 多年来,我不需要添加前缀。 我认为最近的依赖项升级可能要求添加前缀。

以下是我正在使用的依赖项/环境的一些相关版本号:

  • Android Studio 花栗鼠 | 2021.2.1
  • macOS 12.4
  • 类路径'com.android.tools.build:gradle:7.2.0'
  • 类路径“org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10”
  • androidTestImplementation "androidx.test.espresso:espresso-contrib:3.3.0"
  • androidTestImplementation "androidx.test.espresso:espresso-core:3.3.0"
  • 实施“androidx.test.espresso:espresso-core:3.3.0”
  • androidTestImplementation "androidx.appcompat:appcompat:1.4.1"

我知道这是较旧的帖子,但就我而言,解决方案是导入:

*导入 kotlinx.android.synthetic.main.your_activity。 **

如果您从 android 工作室显示的列表中写入 textview 和 select 的部分 ID,它将自动导入

确保你有上面提到的这个插件

插件 { id 'com.android.application' id 'kotlin-android' id 'kotlin-android-extensions' }

插入后,进行同步操作。

在尝试了这篇文章中的所有答案之后,没有一个对我有用,但我能够修复它并且非常容易。

首先我使缓存无效,然后我添加了这一行

导入 com.your.package.R;

在我的情况下,我没有任何导入 R,所以我不得不添加它,有一段时间我认为这不是一个好的解决方案,但经过审查和测试没有问题,我希望你能解决你的问题。

电鳗工作室Android版本

macOS 文图拉 13.2

Gradle 7.2.2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM