簡體   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