Reputation: 2521
I am new to Kotlin. I have converted some code from Java, but it seems like there's something wrong. The R in findViewById(R.id.my_id) is highlighted in red and it shows this message:
Unresolved reference: R
I've been looking for a solution, but I seem not to figure it out. So what should I do?
Here's a screenshot:
Upvotes: 64
Views: 105419
Reputation: 2423
I had it because the namespace in build.gradle was wrong. They should have pointed it out in the problems window but they don't.
Upvotes: 0
Reputation: 101
package com.example.experiments_flutter
package <your_project_name>
Upvotes: 1
Reputation: 2521
The issue can be caused by many factors,
as mentioned by martomstom in this Answer the issue is sometimes caused by com.android.tools.build:gradle
version, changing it's version to a more stable one would solve the problem: for example: com.android.tools.build:gradle:3.4.0-alpha02
with com.android.tools.build:gradle:3.2.1
Also, having libraries from the same group, but with different versions may cause the problem or even more runtime errors. use the exclude group method like the following : implementation('com.squareup.picasso:picasso:2.71828') { exclude(group: 'com.android.support') }
in this case, picasso library uses android.support components, the android library version used in picasso is different than the one you're currently using in your app, so in order to solve this issue, we have to exclude it completely from its sub library and class groups.
It can also happen by the mismatch of resources and code, including this importation line in your activity may solve the problem too : import com.package.name.R
Sometimes it can happen because of the IDE, performances or memory.. Cleaning the project from time to time may save you some time, on Android Studio it would be something like this : Build -> Clean Project / Rebuild Project
- Cleaning IDE cash also helps with performance and memory, on Android Studio it would look like this : File-> Invalidate Chases/ Restart -> Invalidate Cashes and Restart
I noticed that this problem happens to me the most of the time when importing new resources, Using prohibited characters in their names would fire the error, such as . , , - , UpperCase or special Letters
And as a suggestion , if you're using Kotlin, i really recommend using Kotlin extensions in your activity such as : import kotlinx.android.synthetic.main.activity_page.*
or if you're using a custom view : kotlinx.android.synthetic.main.view_layout.view.*
after that, in onCreat() method of an activity , you'll only have to call the id, for example : my_edit_text_ID.text = "Kotlin Dbest!"
, or from a custom view : mCostumView.my_edit_text_ID.text = "Kotlin Dbest!"
EDIT :
I have faced this issue againe and the problem was the '' R '' library was imported from 2 different sources :
com.android.R
com.example.package.R
You must only import the '' R '' library with your application package name,
in this case com.example.package.R
Sometimes the library is not imported at all, to import it, click on the
unresolved reference R
and press Alt + Enter
EDIT:
As tobltobs mentioned in the comments section: " Most of the time the problem is caused by another error which prevents the build system from creating generated sources. To find the root cause look at the gradle log (the "toggle view" icon below of the green hammer in the Build output) and look for errors unrelated to R or BuildConfig (also generated). If there is no other error left and the problem with R persists then maybe something of this list might help. "
EDIT:
As Patrick Beagan mentioned, Kotlin extensions for finding views in layouts are now deprecated - I'd advise using ViewBinding instead
Upvotes: 80
Reputation: 306
I solved this error by following Android Studio's lint tools to upgrade the version of a dependency in the project-level gradle file. In this case, I upgraded androidx.navigation:navigation-safe-args-gradle-plugin
from 2.3.2
to 2.5.2
(latest version), then synced the project.
Upvotes: 0
Reputation: 1899
I also had this problem, Gradle Sync
, and Invalidate Cache
, and Restarting Android Studio Didn't help. Upgrading and Downgrading Gradle were also not helpful.
What worked for me is: Make Project
(Ctrl + F9) and then try to run the project.
Upvotes: 0
Reputation: 88192
I had same problem while using auto-manifest plugin. Adding AndroidManifest.xml
explicitly solved the problem to me.
Upvotes: 0
Reputation: 1034
I had an issue because of this import:
import android.os.Build.VERSION_CODES.*
In the latest version it contains R
Upvotes: 0
Reputation: 2006
I had wrong import statement import android.R
instead of import my.project.package.R
. Fixing it solved the problem
Upvotes: 7
Reputation: 5392
So this is a misleading error. The fastest way to get to the root cause is to run:
bash gradlew assembleDebug --debug
then scroll up and look for the real error happening.
However, if it still doesn't seem like you have the answer you are looking for, then read on.
I'm going to explain the 30,000 foot view of what is happening. This is not EXACT order or EXACT flow, it is just pretty damn close ;) so if you know more then I do of the exact order and care to make corrections with links, feel free I won't stop ya :).
The Process
The R file is generated code.
There is an order to the generation.
Gradle will do it's magic, pull it's dependencies and kick off it's warning and error tree first,
then Android converts all Kotlin to Java behind the scenes. Yup that's right, our beloved Kotlin still has to be Java to compile for our beloved ART virtual machine.
Then it runs through and does the adapters that you have created for JVM Statics and a few other tasks. Next up it compiles all the xml databinding files first to create the generated databinding files.
If everything succeeds it moves on to processing the assets and resources. Which creates pointers or IDs for each resource that you reference in code. Next it will run through and begin compiling the code and packaging process after that.
Pretty straight forward process, but here in lies the problem.
The misleading Error
If any step fails before the R generation is complete, then the R does not get generated. Sometimes a simple rebuild is all you need to do, sometimes a simple File->Invalidate Cache and Restart is all you need. However, more often than not you have a code issue in your gradle, your xml, your databinding or your adapters that are preventing the compiler from even reaching the R generation stage.
So the next question is
"Well shoot, how do we troubleshoot it if the errors are worthless or non-existent".
Well first let's talk about the many ways these errors present themselves.
Next, let's talk about potential candidates causing the problem. As there are sooo many lol.
Unfortunately this happens a lot in bleeding edge technologies where the UI tools are not up to speed with the terminal based tools yet. So I suggest you run from the project root in a terminal with
bash gradlew assembleDebug --debug
When it fails, and it will. Start scrolling up through the logs until you find the red where you see what is actually failing and preventing the next stage from occurring.
You will find this especially useful when you start dealing with databinding.
TIP:
When you start dealing with databinding, make sure you compile and run often because the goal is to recognize right away before doing other files to make sure you didn't break generation and make your life MUCH easier to know code you just added caused the issue before getting too far.
Times to compile and run to confirm no issues before moving on.
Like I mentioned above, the reason is to avoid getting so many changes, that it becomes a troubleshooting nightmare to find a generic vague, horrible error related to generated databinding code. I'm sure the tools will improve, but for now, do yourself a favor and compile and run often when changing Databinding related items.
Happy Coding
Upvotes: 14
Reputation: 1132
I faced the same issue. I restarted my Android Studio, invalidate caches, Sync Gradle but nothing was working. Then I looked into my file and there are 2 imports of my R. 1 import was related to my application package and the other was related to Android.
Removing second import related to android solved this issue.
Upvotes: 0
Reputation: 209
For me it was because I had created a new package and R wasn't available until I imported it from the package above
Upvotes: 0
Reputation: 2063
If your are experiencing this issue in Kotlin because you cannot reference the elements of the xml layout by ids. (e.g. R.id.adView
) then try removing the line import android.R
from your kotlin file.
Upvotes: 0
Reputation: 426
Downgrading gradle version worked for me.
I changed :
Gradle version from : 4.10.4 to 4.4.1
and Gradle Plugin version from : 3.3.1 to 3.1.3
Upvotes: 0
Reputation: 204
Here is the solution, File->Project Structure->Project, select Android Gradle Plugin Version as 3.2.1 from the drop-down. then click apply.
Upvotes: -5
Reputation: 143
I had the same problem, and I tried not to downgrade from gradle version 3.3 to gradle version 3.2.1. Instead I updated Android Studio to version 3.3, which made the trick for me ;-)
Upvotes: 4
Reputation: 725
I had the same problem with R reference too.
Finally Android Studio 3.3 has been released and using 'com.android.tools.build:gradle:3.3.0'
the problem has been fixed!
Upvotes: 1
Reputation: 1767
I believe that I came across the real answer (though by accident).
I also, as the OP had my KT file fail to location R. as well as other classes that happen to be in java. What I noticed was that there was a case difference I the filenames. Once I corrected the import statements to match the case of the package (aka, folder) the errors resolved.
Upvotes: 0
Reputation: 1
TRY THIS
Go to the content_main.xml file and there you need to change the
android:id="@+id/??????">
line of code to whatever id you have given to your file.
Replace question mark ??????
with the related file id name.(IF you dont know the id go to the design tab on the bottom and click on the related Asset.
On the right side below attributes, you can find the ID you have given to it. If it is blank you can freshly name it and Android Studio will write the code.
Then restart Android Studio. Hope this will help. Happy coding.
Upvotes: 0
Reputation: 515
Use gradle commands.
In Android Studio, on the right menu:
Gradle -> :app -> Tasks -> build -> clean
.
After that, Gradle -> :app -> Tasks -> build -> build
Upvotes: 10
Reputation: 603
I used com.android.tools.build:gradle:3.3.0-alpha13 and had the same issue. Changing to stable Version 3.2.1 solved this problem for me.
Upvotes: 32
Reputation: 113
This worked for me. How much work it is depends on how big your project is. I started a new project, created the required modules (XML, Kotlin, colors, strings, etc.), then copied the code into the modules in the new project from the modules in the old project. Copying XML saves a lot of time compared to recreating the UI. All in all, it take a little while, but I have spent much more time tring to fix the unresolved reference error without it.
Upvotes: 0