본문 바로가기

Android/Samples & Tips

[Android] R.java 관련 에러 / R.java error

[Android] R.java 관련 에러 / R.java error

R.java 관련 에러들은 생각하고 있지 않으면 찾기 쉽지 않은 경우가 좀 있어서 정리해 둡니다.





 R.java 파일에 대해서

R.java는 프로젝트내의 gen 폴더에 있습니다. 자동으로 만들어지는 파일이죠.
우리가 리소스를 추가하면 리소스의 아이디(integer)를 자동적으로 추가해 줍니다.



/* AUTO-GENERATED FILE.  DO NOT MODIFY.
 *
 * This class was automatically generated by the
 * aapt tool from the resource data it found.  It
 * should not be modified by hand.
 */

R.java 파일의 맨 위에는 이런 주석이 있군요.
대충 읽어보면 자동적으로 생성되는 파일이니까 수정하지 말아라. 수동으로 수정하지 마셈! 같은 내용이네요.

기본적으로는 R.java 안에 위와같은 클래스들만 있지만
위에 없는 리소스 폴더를 만들고 추가하면 더 많은 리소스 클래스들이 자동적으로 생성됩니다.

Resource 관련글 

R.java 파일 관련 에러가 발생했다면, 에러를 차분히 찾고 잠시 기다리면 에러가 없어집니다.
괜히 R.java 파일을 직접 고치려고 시도하지 마세요 ^^







 resource file 이름 

     

프로젝트에 에러가 떴습니다. 그런데 어떤 파일에서 에러가 났는지를 모르겠습니다.

console에 뭔가 빨간색 글씨가 훅 하고 지나가 버립니다. 스크롤을 해서 한번 자세히 들여다 보았습니다.



유효하지 않은 파일 이름이라고 에러가 납니다. 이름을 어떻게 정해야 하는지에 대한 패턴이 나오네요.
영어 소문자, 숫자, 언더바, 점(.), 이렇게 네가지만을  사용해서 이름을 정해야 하는군요.

Resource File Name
 1. 영어 소문자
 2. 숫자
 3. 밑줄(_)
 4. 마침표(.) 

리소스파일은 위의 4가지에 맞추어 이름을 지어주어야 합니다. 그렇지 않으면 위와같은 에러를 보실 수 있습니다.
보통 대문자를 넣거나, - 를 넣거나, 괄호는 넣는 예를 들 수 있겠습니다.(폴더이름에는 - 사용가능, 파일에는 사용불가)







 import android.R;

     


클래스 파일에 에러가 발생했습니다.
R.layout, R.id 등으로 접근하는 모든 코드에 빨간 밑줄이 생겼군요. 참 난감합니다.

이럴때 import 된 패키지, 클래스들을 살펴볼 필요가 있습니다.

     


android.R; 이라는 클래스가 import 되어있군요.
기본적으로 직접 추가한 resource 들에 접근을 할때는 project의 packageName.R 파일로 접근을 합니다.

다시 말하자면 android.R 이 먼저 import 되어 버림으로써 내 프로젝트의 R 파일에 접근하지 못하고,
android.R을 통해 내가 추가한 리소스에 접근을 하려고 하니, 에러가 나는 것입니다.

import android.R; 이 코드를 지워줍니다.
(기본적으로 R 파일은 project의 패키지명과 같은 위치에 있기 때문에 지우기만 해도 해결이 됩니다.)

사실 지우기만 해도 해결이 되지만, 좀 더 명시적으로 보여주기 위해 내 프로젝트의 R 파일을 import 해봅니다.

     


이제 코드를 다시 보면 아래와 같이 악마의 빨간 밑줄이 모두 사라진걸 확인할 수 있습니다.

      


android.R 이 추가되어 버리면, 내 프로젝트의 R 파일에 접근하기 힘들어 집니다.
보통의 경우엔 내 프로젝트의 리소스가 우선적으로 사용된다고 판단되기 때문에,
android.R 은 import 하지 않는게 맞다고 생각합니다.

하지만 꼭 사용해야 하는 몇번의 경우가 있을 수 있습니다.
그럴 땐, 해당 코드의 위치에서 직접적인 접근을 해서 사용하면 됩니다.

예를들면 아래 그림과 같은 방식의 접근을 말합니다.

     


이런 방식을 통해 풀 패키지 이름을 쓰고 접근한 경우엔 android.R을 import 없이 사용할 수 있습니다.









R.java 관련 에러들은 생각나는데로 지속적으로 추가하도록 하겠습니다.