Android Studio 3.1.3 - 未解决的参考:R - Kotlin

Posted

技术标签:

【中文标题】Android Studio 3.1.3 - 未解决的参考:R - Kotlin【英文标题】:Android Studio 3.1.3 - Unresolved reference: R - Kotlin 【发布时间】:2019-01-08 07:37:23 【问题描述】:

我是 kotlin 的新手,我已经从 java 转换了一些代码,但似乎有问题,findViewById(R.id.my_id) 中的 R 以红色突出显示,并显示此消息:“未解决的参考:R “..我一直在寻找解决方案,但我似乎没有弄清楚,那我该怎么办? 这是截图:

【问题讨论】:

你试试Invalidate Cache / Restart. 如果您的项目没有错误,有时这个问题只需通过 Build 就可以解决 您知道在 Kotlin 中您的活动中不需要 findViewById 吗? 是的_____________ 【参考方案1】:

这个问题可能是由多种因素引起的,

正如martomstom 在Answer 中提到的,问题有时是由com.android.tools.build:gradle 版本引起的,将其版本更改为更稳定的版本可以解决问题:例如:com.android.tools.build:gradle:3.4.0-alpha02com.android.tools.build:gradle:3.2.1

此外,拥有来自同一组但版本不同的库可能会导致问题甚至更多运行时错误。使用如下的排除组方法: implementation('com.squareup.picasso:picasso:2.71828') exclude(group: 'com.android.support') 在这种情况下,毕加索库使用 android.support 组件,毕加索中使用的 android 库版本与您当前在应用程序中使用的不同,因此为了解决这个问题,我们必须把它完全排除在它的子库和类组之外。

资源和代码不匹配也可能发生这种情况,在您的活动中包含此导入行也可以解决问题:import com.package.name.R

有时会因为 IDE、性能或内存而发生。不时清理项目可能会节省一些时间,在 Android Studio 上会是这样的:Build -> Clean Project / Rebuild Project - 清理 IDE 现金也有助于提高性能和内存,在 Android Studio 上它看起来像这样:File-> Invalidate Chases/ Restart -> Invalidate Cashes and Restart

我注意到这个问题大多数时候在导入新资源时发生在我身上,在其名称中使用禁止字符会引发错误,例如. , , - , UpperCase or special Letters

作为一个建议,如果您使用的是 Kotlin,我真的建议您在您的活动中使用 Kotlin 扩展,例如:import kotlinx.android.synthetic.main.activity_page.* 或者如果您使用的是自定义视图:@987654332 @ 之后,在活动的 onCreat() 方法中,您只需调用 id,例如:my_edit_text_ID.text = "Kotlin Dbest!",或从自定义视图:mCostumView.my_edit_text_ID.text = "Kotlin Dbest!"

编辑:

我又遇到了这个问题,问题是“R”库是从 2 个不同的来源导入的:

com.android.R

com.example.package.R

您只能使用您的应用程序包名称导入“R”库, 在这种情况下com.example.package.R 有时库根本没有导入,要导入它,请单击 未解决的参考R 并按Alt + Enter

编辑:

正如tobltobs 在 cmets 部分中提到的那样:“大多数情况下,问题是由另一个错误引起的,它阻止构建系统创建生成的源。要找到根本原因,请查看 gradle 日志(“切换视图" 生成输出中绿色锤子下方的图标)并查找与 R 或 BuildConfig 无关的错误(也已生成)。如果没有其他错误并且 R 的问题仍然存在,那么此列表中的某些内容可能会有所帮助。“

编辑:

正如 Patrick Beagan 所说,Kotlin 扩展现已弃用 - 我建议改用 ViewBinding

【讨论】:

对我来说,即使 r 无法运行该应用程序也无法解决。我正在使用 mac @KMC,很高兴它对您有所帮助,如果您仍想使用这些库,您可以使用 exclude 方法,我已经更新了第二个项目符号,您可以查看一下。 在片段顶部添加 import com.package.name.R 有帮助 我的问题出在包名上——我已经更改了它,但显然不是到处都有——自动生成的活动使用了旧名称。我对包名进行了重构,一切恢复正常。 我在集成 lib 源(例如,删除 .jar/aar 并将其替换为 src 文件夹)以进行调试时发生了这种情况。在这种情况下,R 导入不是问题文件所在的包名称,它是来自 AndroidManifest.xml 的 MAIN 活动的 Activity 源所在的包。【参考方案2】:

我使用了 com.android.tools.build:gradle:3.3.0-alpha13 并且遇到了同样的问题。更改为稳定版本 3.2.1 为我解决了这个问题。

【讨论】:

是的,恢复到 3.3.0-alpha13 stable 3.2.1 解决了这个问题! 对于 3.3.1 稳定版仍然是实际的。需要更改为 3.2.1 并且 R 已解决。应用程序正在编译,但未导入 R,而 Kotlin 扩展工作正常。【参考方案3】:

所以这是一个误导性错误。 找到根本原因的最快方法是运行:

bash gradlew assembleDebug --debug

然后向上滚动并查找发生的真正错误。

但是,如果您仍然没有找到想要的答案,请继续阅读。

我将解释正在发生的事情的 30,000 英尺视图。这不是确切的顺序或确切的流程,它只是非常接近;)所以如果你知道更多,那么我会知道确切的顺序并注意通过链接进行更正,请随意,我不会阻止你 :)。

过程

R文件生成代码。

世代是有先后顺序的。

Gradle 会发挥它的魔力,拉取它的依赖项并启动它 警告和错误树优先,

然后 Android 在后台将所有 Kotlin 转换为 Java。是的,就是这样 对,我们心爱的 Kotlin 仍然必须是 Java 才能为我们编译 心爱的ART虚拟机。

然后它会运行并执行您为其创建的适配器 JVM 静态和其他一些任务。 接下来,它首先编译所有 xml 数据绑定文件以创建 生成的数据绑定文件。

如果一切顺利,它会继续处理资产和 资源。它为您创建的每个资源创建指针或 ID 代码中的参考。接下来它将运行并开始编译 之后的代码和打包过程。

非常简单的过程,但问题就在这里。

误导性错误

如果在 R 生成完成之前任何步骤失败,则不会生成 R。有时你只需要一个简单的重建,有时你只需要一个简单的 File->Invalidate Cache and Restart。但是,您的 gradle、xml、数据绑定或适配器中的代码问题通常会阻止编译器进入 R 生成阶段。

那么下一个问题是

“好吧,如果错误毫无价值或 不存在”。

首先让我们谈谈这些错误的多种表现方式。

发现重复的数据绑定类 第 # 行的 xml 绑定错误 找不到匹配的 bind:customAdapterMethod 签名 找不到正确项目的 R 文件,仅显示子模块的导入选项或不正确的命名空间 R 文件。 找不到活动/片段的 DataBindingUtility 或 DataBinding 还有许多其他不同的方式,太多了,无法一一列举

接下来,让我们谈谈导致问题的潜在候选人。因为有很多大声笑。

Gradle 同步问题 Gradle 或工具的错误版本,您可能在上次修改 gradle 文件时走得太远了。尝试退回一个版本并“使缓存无效并重新启动”,如果修复它,很好,如果没有,请继续阅读。 缓存问题(文件->重新启动并使缓存无效) xml 元素的命名空间错误 具有错误 ID 或引用 ID 无序的 xml 元素(即,您说对齐到 xml 文档中较低的元素的右侧,然后是尝试引用它的兄弟元素) xml 数据绑定问题引用不存在或未正确键入的命名空间或成员 xml 数据绑定问题在非自动填充的地方,比如使用适配器的自定义属性,因为这些更难发现。即绑定:myCustomMethod=@"myObject.mistypedProperty()" JVM 静态适配器存在问题或重复签名 Strings 或 Dimens 文件或任何其他 xml 文件中的重复字符或错误字符 标记为@Binding 的私有变量,没有访问它的属性 标记为 @Binding 的成员变量与父类方法匹配,导致重复,几乎不可能出现错误 类型不匹配,例如使用采用 (Int) 的适配器,但您通过数据绑定传递 (Int?),直到编译时它才能被 JVM Statics 识别 您在弹出窗口中选择了 IMPORT 以导入子模块的 R 文件而不是应用程序文件 在子类或父类中具有可绑定成员,但在父类或子类的 XML 用法中没有为类强制转换提供完全限定的命名空间。由于数据绑定编译器不够智能,无法实现为类 Foo 提供的变量也是 parentFoo 基类,因此您必须将其限定为 android:text="@((com.path.parentFoo)foo).parentMethod" 在类中有一个方法名称,它与“从@Binding 成员变量生成的属性”匹配,即作为变量的 firstName,但是在父类或子类中有一个名为 getFirstName 的方法,因为您现在正在匹配一个方法将自动生成的名称,从而导致 dataBindingUtility 重复类错误。 还有更多原因,但这应该会给您提供一系列值得关注的地方,但这个列表可以继续下去。

不幸的是,这种情况经常发生在前沿技术中,其中 UI 工具还没有跟上基于终端的工具的速度。所以我建议你在终端中从项目根目录运行

bash gradlew assembleDebug --debug

当它失败时,它会。开始向上滚动日志,直到找到红色的地方,您可以看到实际失败并阻止下一阶段的发生。

当您开始处理数据绑定时,您会发现这特别有用。

提示:

当您开始处理数据绑定时,请确保您经常编译和运行,因为目标是在处理其他文件之前立即识别,以确保您不会破坏生成并使您的生活更容易了解您刚刚添加的代码在走得太远之前引起了问题。

在继续之前编译和运行确认没有问题的时间。

如果添加一些 JVM 静态编译并运行 如果将变量添加到要使用的 XML 中 如果您在 1 个文件中绑定到模型的属性 如果将绑定添加到 JVMStatic 如果您将可绑定成员或属性添加到模型中 如果重构将可观察成员变量或属性移动到子类或基类中 可能影响生成代码的任何其他 xml 或绑定相关元素。

就像我上面提到的,原因是为了避免进行如此多的更改,以至于找到与生成的数据绑定代码相关的一般模糊、可怕的错误成为故障排除的噩梦。我相信这些工具会有所改进,但现在,请帮自己一个忙,在更改数据绑定相关项目时经常编译和运行。

快乐编码

【讨论】:

有点长,你可能会添加一个 tl;dr,查看 gradle 日志输出将有助于找到真正的原因。【参考方案4】:

使用 gradle 命令。 在 Android Studio 中,在右侧菜单中:Gradle -> :app -> Tasks -> build -> clean. 之后,Gradle -> :app -> Tasks -> build -> build

【讨论】:

如果您在右侧没有看到 Gradle 菜单。检查Android MenuBar -> View-> Tool Windows -> Gradle 您也可以从命令行执行此操作:rm -rf .gradle | rm -rf build/ | ./gradlew assemble【参考方案5】:

我遇到了同样的问题,我尝试不从 gradle 版本 3.3 降级到 gradle 版本 3.2.1。相反,我将 Android Studio 更新到了 3.3 版,这对我来说是个窍门 ;-)

【讨论】:

将 Android Studio 更新到 3.3.1 版本为我解决了这个问题【参考方案6】:

我有错误的导入语句 import android.R 而不是 import my.project.package.R。修复它解决了问题

【讨论】:

package com.mydomain.appname 就我而言,我已经复制了代码,因此我忘记将包名称更改为我的。 仍然让我着迷,检查了导入结果却发现它是 android.R... 删除它会自动触发 IDE 自动导入包级别 R 类的正确文件【参考方案7】:

这对我有用。它的工作量取决于您的项目有多大。我开始了一个新项目,创建了所需的模块(XML、Kotlin、颜色、字符串等),然后将代码从旧项目中的模块复制到新项目中的模块中。与重新创建 UI 相比,复制 XML 可以节省大量时间。总而言之,这需要一点时间,但我花了更多的时间来修复没有它的未解决的引用错误。

【讨论】:

【参考方案8】:

试试这个

转到 content_main.xml 文件,您需要在此处更改

android:id="@+id/??????"> 将代码行添加到您为文件提供的任何 id。

将问号??????替换为相关的文件ID名称。(如果您不知道ID,请转到底部的设计选项卡并单击相关资产。

在属性下方的右侧,您可以找到您为其提供的 ID。 如果它是空白的,你可以重新命名它,Android Studio 将编写代码。

然后重启 Android Studio。希望这会有所帮助。编码愉快。

【讨论】:

【参考方案9】:

我相信我找到了真正的答案(虽然是偶然的)。

我也是,因为 OP 让我的 KT 文件无法定位 R. 以及其他恰好在 java 中的类。我注意到文件名存在大小写差异。一旦我更正了导入语句以匹配包(又名文件夹)的大小写,错误就解决了。

【讨论】:

【参考方案10】:

我对 R 引用也有同样的问题。 终于 Android Studio 3.3 发布了,使用'com.android.tools.build:gradle:3.3.0'问题已经解决了!

【讨论】:

【参考方案11】:

我将 Android Studio 更新到 3.3.1 版本并解决了这个问题。

【讨论】:

kotlin version = '1.3.21' gradle plugin version = '3.3.2' gradle version = '4.10.1' 在 Android Studio 3.2.1 上遇到了这个问题,升级 Android Studio 到 3.3.2解决了问题【参考方案12】:

降级 gradle 版本对我有用。

我变了:

从 4.10.4 到 4.4.1 的 Gradle 版本

和 Gradle 插件版本从 3.3.1 到 3.1.3

【讨论】:

【参考方案13】:

如果您在 Kotlin 中遇到此问题,因为您无法通过 id 引用 xml 布局的元素。 (例如R.id.adView)然后尝试从您的 kotlin 文件中删除行 import android.R

【讨论】:

【参考方案14】:

对我来说,这是因为我创建了一个新包,而在我从上面的包中导入它之前,R 不可用

【讨论】:

【参考方案15】:

我遇到了同样的问题。我重新启动了我的 Android Studio,使缓存无效,同步 Gradle 但没有任何效果。然后我查看了我的文件,我的 R 有 2 个导入。1 个导入与我的应用程序包相关,另一个与 Android 相关。

    导入 com.example.myApp.R import android.R // 这个导入是在构建过程中意外添加的。

删除与 android 相关的第二个导入解决了这个问题。

【讨论】:

【参考方案16】:

由于此导入,我遇到了问题:

import android.os.Build.VERSION_CODES.*

在最新版本中它包含 R

【讨论】:

【参考方案17】:

这是解决方案, File->Project Structure->Project,从下拉列表中选择 Android Gradle Plugin Version 为 3.2.1。然后点击应用。

【讨论】:

这对我不起作用。 File->Invalidate Caches/Restart 正如另一个答案所建议的那样为我工作,但正如其他人所指出的那样,这个问题没有单一的解决方案。它可能是由很多事情引起的。

以上是关于Android Studio 3.1.3 - 未解决的参考:R - Kotlin的主要内容,如果未能解决你的问题,请参考以下文章

android studio 3.1.3中的Gradle项目同步失败

Android studio 3.1.3创建新项目,c ++支持同步失败

没有USB设备android studio 3.1.3

Android studio 3.1.3真机调试报错,no target device found

Android Studio 3.1.3 - 未解决的参考:R - Kotlin

Android Studio 3.1.3 Gradle 同步错误。无法下载 Gradle-Core.jar