代码之家  ›  专栏  ›  技术社区  ›  Tamim Attafi

Android Studio 3.1.3-未解析引用:R-Kotlin

  •  22
  • Tamim Attafi  · 技术社区  · 6 年前

    我是kotlin的新手,我已经从java转换了一些代码,但似乎有问题,findViewById(R.id.my_id)中的R以红色突出显示,它显示以下消息:“Unresolved reference:R”。。我一直在寻找解决办法,但我似乎没有弄明白,所以我该怎么办? 这是一张截图:

    enter image description here

    11 回复  |  直到 6 年前
        1
  •  27
  •   martomstom    6 年前

    我用的是com.android.tools.build:gradle:3.3.0-alpha13,也有同样的问题。切换到稳定版本3.2.1为我解决了这个问题。

        2
  •  20
  •   Tamim Attafi    5 年前

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

    • 正如martomstom在这篇文章中提到的 Answer 这个问题有时是由 com.android.tools.build:gradle 版本,将其版本更改为更稳定的版本将解决问题:例如: com.android.tools.build:gradle:3.4.0-alpha02 具有 com.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 cash也有助于提高性能和内存,在Android Studio上,它看起来是这样的: File-> Invalidate Chases/ Restart -> Invalidate Cashes and Restart
    • 我注意到,在导入新资源时,大多数情况下都会遇到这个问题,在它们的名称中使用被禁止的字符会引发错误,例如 . , , - , UpperCase or special Letters
    • 作为建议,如果你使用 科特林 ,我真的建议在您的活动中使用Kotlin扩展,例如:import kotlinx.android.synthetic.main.activity_page.* 或者如果使用自定义视图: kotlinx.android.synthetic.main.view_layout.view.* 之后 ,在活动的onCreat()方法中,只需调用id,例如: my_edit_text_ID.text = "Kotlin Dbest!" ,或从自定义视图: mCostumView.my_edit_text_ID.text = "Kotlin Dbest!"

    编辑:

    • 我再次遇到此问题,问题是从两个不同的源导入了“R”库:

      com.android.R网站

      com.example.package.R包

      您只能导入具有应用程序包名称的“R”库, 在这种情况下 com.example.package.R 有时库根本没有导入,要导入它,请单击 未解析引用 R 和媒体 Alt + Enter

    编辑:

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

        3
  •  8
  •   Sam    6 年前

    所以这是一个误导性的错误。

    我要解释30000英尺高的景象。这不是确切的顺序或确切的流程,它只是相当接近;)所以如果你知道更多,那么我做的确切顺序,并注意与链接的更正,请放心,我不会阻止你:)。

    过程

    R文件是生成的代码。

    这一代人是有秩序的。

    Gradle会变魔术,把依赖性拉出来 首先是警告和错误树,

    然后Android在幕后将所有Kotlin转换为Java。是的,那是 对,我们深爱的Kotlin仍然必须是Java来编译 心爱的艺术虚拟机。

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

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

    很直接的过程,但问题就在这里。

    误导性错误

    如果在R生成完成之前有任何步骤失败,则不会生成R。有时只需要简单的重建,有时只需要简单的文件->使缓存失效并重新启动。然而,在你的gradle、xml、数据绑定或适配器中,你经常会遇到代码问题,这使得编译器甚至无法进入R生成阶段。

    所以下一个问题是

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

    好吧,首先让我们来谈谈这些错误的表现方式。

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

    接下来,让我们来谈谈引起这个问题的潜在候选人。因为有太多的棒棒糖。

    • 梯度同步问题
    • 缓存问题(文件->重新启动并使缓存无效)
    • 命名空间错误的xml元素
    • id错误或引用id顺序错误的xml元素(即,您说在xml文档中较低的元素的右边对齐,然后是试图引用它的同级元素)
    • 引用不存在或未正确键入的命名空间或成员的XML数据绑定问题
    • 非自动填充点中的xml数据绑定问题,如使用适配器的自定义属性,因为这些问题很难发现。即bind:myCustomMethod=@“myObject.mistypedProperty()”
    • 带有问题或重复签名的JVM静态适配器
    • 字符串、Dimens文件或任何其他xml文件中的重复或错误字符
    • 标记为@Binding的私有变量,但没有访问它的属性
    • 标记为@Binding的成员变量,该变量与父类方法匹配,从而导致重复,并在几乎不可能的错误中出现
    • 类型不匹配,例如使用接受(Int)但传递(Int?)通过数据绑定,它在编译时才被JVM静态识别
    • 您在弹出窗口中选择导入以导入子模块的R文件,而不是应用程序文件
    • 在子类或父类中具有可绑定成员,但在父类或子类的XML用法中没有为类强制转换提供完全限定的命名空间。由于数据绑定编译器不够智能,无法实现为类Foo提供的变量也是parentFoo基类,因此必须将其限定为android:text=“@((com.path.parentFoo)Foo.parentMethod”
    • 在类中具有与“从@Binding member variable生成的属性”匹配的方法名(即firstName作为变量),但在父类或子类中具有名为getFirstName的方法,因为您现在正在匹配将自动生成的方法名,从而导致databindingulity重复类错误。
    • 有更多的原因,但这应该给你一系列的地方看,但名单可以继续认真。

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

    bash gradlew assembleRelease --debug
    

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

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

    提示:

    当您开始处理数据绑定时,请确保您经常编译和运行,因为目标是在执行其他文件之前立即识别,以确保您没有中断生成,并使您的生活更容易知道您刚刚添加的代码在过远之前导致了问题。

    编译和运行的时间,以确认没有问题,然后再继续。

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

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

    快乐编码

        4
  •  5
  •   Dr.jacky Mateusz Kaflowski    6 年前

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

        5
  •  3
  •   HasBert    6 年前

    我也遇到了同样的问题,我试着不从Gradle3.3版本降级到Gradle3.2.1版本。相反,我将Android Studio更新到了3.3版本,这让我有了窍门;-)

        6
  •  0
  •   Earl Whitney    6 年前

    这对我有效。它的工作量取决于你的项目有多大。我启动了一个新项目,创建了所需的模块(XML、Kotlin、colors、strings等),然后将代码从旧项目中的模块复制到新项目中的模块中。与重新创建UI相比,复制XML节省了很多时间。总而言之,这需要一点时间,但是我花了更多的时间来尝试修复未解决的引用错误。

        7
  •  0
  •   PRANAY REDDY    6 年前

    试试这个

    转到content\u main.xml文件,在那里您需要更改

    android:id="@+id/??????"> 一行代码到您给文件的任何id。

    替换问号 ?????? 使用相关的文件id名称。(如果不知道id,请转到底部的“设计”选项卡,然后单击相关的资源。

    在属性下面的右侧,您可以找到您给它的ID。 如果是空的,你可以直接命名它,Android Studio将编写代码。

    然后重新启动Android Studio。希望这会有帮助。快乐的编码。

        8
  •  0
  •   Kenneth Argo    6 年前

    我相信我偶然找到了真正的答案。

    同时,由于操作程序让我的KT文件无法定位R.以及碰巧在java中的其他类。我注意到文件名有大小写的区别。一旦我更正了import语句以匹配包(aka,folder)的大小写,错误就解决了。

        9
  •  0
  •   Josue    6 年前

    我对参考文献也有同样的问题。 最终Android Studio 3.3已经发布并使用 'com.android.tools.build:gradle:3.3.0' 问题已经解决了!

        10
  •  0
  •   dudukee    6 年前

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

        11
  •  0
  •   Ankush Joshi    5 年前

    降级梯度版本对我有效。

    我改了:

    Gradle版本从:4.10.4到4.4.1

    和Gradle插件版本从:3.3.1到3.1.3

        12
  •  -2
  •   Nithesh    6 年前

    这是解决办法, 文件->项目结构->项目,从下拉列表中选择Android Gradle Plugin Version as 3.2.1。然后单击“应用”。