我是kotlin的新手,我已经从java转换了一些代码,但似乎有些不对劲,findViewById(R.id.my_id)中的R以红色突出显示,并显示以下消息:"未解析的引用:R"..我一直在寻找解决方案,但我好像不知道,所以我该怎么办?这是一个截图:
1> 小智..:
我使用了com.android.tools.build:gradle:3.3.0-alpha13并遇到了同样的问题.更改为稳定版本3.2.1为我解决了这个问题.
Yup恢复到3.3.0-alpha13稳定3.2.1修复了这个问题!
2> Tamim Attafi..:
这个问题可能是由许多因素造成的,
正如martomstom在本回答中提到的那样,问题有时是由com.android.tools.build:gradle
版本引起的,将其版本更改为更稳定版本可以解决问题:例如:com.android.tools.build:gradle:3.4.0-alpha02
withcom.android.tools.build:gradle:3.2.1
此外,拥有来自同一组但具有不同版本的库可能会导致问题甚至更多的运行时错误.
它也可能由于资源和代码不匹配而发生,包括您活动中的这个输入行也可能解决问题: implementation('com.squareup.picasso:picasso:2.71828') { exclude(group: 'com.android.support') }
有时它会因为IDE,性能或内存而发生.不时清理项目可能会节省你一些时间,在Android Studio上它会是这样的:import com.package.name.R
-在Android上清理IDE现金也有助于提高性能和内存Studio看起来像这样:Build -> Clean Project / Rebuild Project
我注意到在导入新资源时大多数时间都会发生这个问题,在名称中使用禁用字符会触发错误,例如 File-> Invalidate Chases/ Restart -> Invalidate Cashes and Restart
作为一个建议,如果你正在使用Kotlin,我真的建议在你的活动中使用Kotlin扩展,例如:import . , , - , UpperCase or special Letters
或者你正在使用自定义视图:kotlinx.android.synthetic.main.activity_page.*
之后,在活动的onCreat()方法中,你将会只需要调用id,例如:kotlinx.android.synthetic.main.view_layout.view.*
或者从自定义视图中调用:my_edit_text_ID.text = "Kotlin Dbest!"
编辑:
我遇到过这个问题,问题是''R''库是从2个不同来源导入的:
com.android.R
com.example.package.R
您只能使用您的应用程序包名称导入"R"库,在这种情况下,mCostumView.my_edit_text_ID.text = "Kotlin Dbest!"
有时根本不导入库,导入它,单击未解析的参考com.example.package.R
并按R
第一个选择对我来说是正确的选择.谢谢!
@KMC,很高兴能为您提供帮助,如果您仍然想使用这些库,则可以使用exclude方法,我已经更新了第二个项目符号,可以将其检出。
3> Sam..:
所以这是一个误导性错误.
我将解释30,000英尺的正在发生的事情.这不是精确的订单或精确的流程,它只是非常接近;)所以,如果你知道更多然后我做的确切的顺序和关心修改链接,感觉自由我不会停止你:).
过程
R文件是生成的代码.
有一代人的命令.
Gradle会做它的魔力,拉动它的依赖关系并首先启动它的警告和错误树,
然后Android在幕后将所有Kotlin转换为Java.是的,我们心爱的Kotlin仍然必须为我们心爱的ART虚拟机编译Java.
然后它会运行并执行您为JVM Statics创建的适配器以及一些其他任务.接下来,它首先编译所有xml数据绑定文件,以创建生成的数据绑定文件.
如果一切顺利,它将继续处理资产和资源.这会为您在代码中引用的每个资源创建指针或ID.接下来,它将贯穿并开始编译代码和打包过程.
非常直接的过程,但这里存在的问题.
误导性错误
如果在R生成完成之前任何步骤失败,则R不会生成.有时您需要进行简单的重建,有时只需要简单的文件 - >无效缓存和重启即可.但是,您的gradle,xml,数据绑定或适配器中的代码问题通常会阻止编译器进入R生成阶段.
所以下一个问题是
"拍好,如果错误毫无价值或根本不存在,我们如何解决问题".
首先让我们谈谈这些错误出现的许多方式.
找到重复的数据绑定类
第#行的xml绑定错误
无法找到bind的匹配签名:customAdapterMethod
找不到正确项目的R文件,只显示子模块的导入选项或不正确的命名空间R文件.
找不到活动/片段的DataBindingUtility或DataBinding
还有许多其他方式,太多,无法列出所有
接下来,让我们谈谈造成问题的潜在候选人.因为有很多大声笑.
Gradle同步问题
缓存问题(文件 - >重新启动和无效缓存)
具有错误命名空间的xml元素
具有错误ID或引用ID的xml元素无序(即,您说要在xml文档中较低的元素的右侧对齐,然后尝试引用它的兄弟元素)
xml数据绑定问题引用不存在或未正确键入的命名空间或成员
非自动填充点中的xml数据绑定问题,例如使用适配器的自定义属性,因为更难以发现.即bind:myCustomMethod = @"myObject.mistypedProperty()"
具有问题或重复签名的JVM静态适配器
字符串或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 assembleRelease --debug
当它失败时,它会.开始向上滚动日志,直到找到红色,在那里您可以看到实际发生故障并阻止下一个阶段发生.
当您开始处理数据绑定时,您会发现这特别有用.
小费:
当你开始处理数据绑定时,请确保你经常编译和运行,因为目标是在做其他文件之前立即识别,以确保你没有破坏生成并让你的生活更容易知道你刚刚添加的代码导致问题在走得太远之前.
在继续之前编译并运行以确认没有问题的时间.
如果添加一些JVM静态编译并运行
如果要将变量添加到要使用的XML中
如果在1个文件中绑定模型的属性
如果您向JVMStatic添加绑定
如果将可绑定成员或属性添加到模型
如果重构将可观察成员变量或属性重构为子类或基类
任何其他可影响生成代码的xml或绑定相关元素.
就像我上面提到的那样,原因是为了避免得到这么多的变化,找到与生成的数据绑定代码相关的通用模糊,可怕的错误就成了一个故障排除的噩梦.我确信这些工具会有所改进,但是现在,在更改数据绑定相关项目时,请自己帮个忙并编译并运行.
快乐的编码
4> Fireworks..:
使用gradle命令.
在Android Studio的右侧菜单中:
Gradle -> :app -> Tasks -> build -> clean
.
之后,Gradle -> :app -> Tasks -> build -> build