프로그램/안드로이드

안드로이드에서 레이아웃 추가했는데, cannot be resolved or is not a field 에러 날 때.

(주)CKBcorp., 2014. 4. 8. 08:00
반응형




아는 사람은 알겠지만, Eclipse + Android 는 기본 설정이 Auto Build 다.

즉, 코드 치면 실시간으로 compile 하면서 에러 잡는다.


그리고, 기본적으로 화면 구성하는 layout 은 그냥 xml 추가하면 알아서 R.java 에서 Resource 관리한다.


근데, 이게 ... "cannot be resolved or is not a field"  라고 에러를 뿜어내는 경우가 있다.

보통은 이런 에러 보기도 힘든데.... 그때문에 한번 이런 에러가 나오면, 어찌 대처할 지 모른다.


해당 에러의 근본적인 원인은, 글에 써 있는대로 R.java 에서 추가한 xml  을 사용할 수 없는거다. 이하의 내용을 확인해 보자( 편의상, 추가한 xml 은 layout1.xml 이라고 하자. )


이 경우, 에러 원인은 두 가지다.


1. R.java 에 실제로 layout1.xml 이 없는 경우

> 이클립스 화면 왼쪽 "Package Explore" 에서 현재 작업중인 프로젝트 아래의 "gen" 아래에 있는 R.java 를 확인해 본다.

만일  static final int layout1 이 선언되어 할당되어 있지 않다면, 이건 layout1.xml 파일 자체가 에러가 있는거다.

여기서 주의할 점은, layout1.xml 자체에는 에러가 없다고 하더라도 layout1.xml 이 외부 리소스를 참고하고 있는데 ( include 나  string, style, color , theme 등 ) 해당 리소스가 없거나 맞지 않다면, 에러가 발생해도 화면에 표시되지 않는다.


2. R.java 에는 static final int layout1 이 선언되어 있는데, java 소스 코드에서 SetContent( R.layout.layout1 ) 을 읽지 못하는 경우.

> R.java 에 layout1 이 있는걸 확인했는데도 cannot be resolved or is not a field 가 계속 뜬다면, 이것은 해당 소스가 R.java 를 제대로 include하고 있지 않을 가능성이 크다.

이클립스에서  java 소스 개발할때는 , CTRL + SHIFT + O 키를 누르면 필요한 파일들이 알아서 IMPORT 된다.

그런데 andriod 의 경우... 리소스 파일을 참조하기 위해서는 import 할 때 "패키지 이름.R"  을 import 해야 한다.


예를 들어, 

package 이름이 "kr.co.comp.pkg1"  이라면, 

import 해야 하는 파일은 "kr.co.comp.pkg1.R"   이다.

근데, 이걸 확인안하고 습관대로 CTRL + SHIFT + O 로 include 하면, 

"android.R" 이 import 될 때가 있다.


이러면, 코드 자체에는 문제가 없지만 프로젝트의 R.java 를 가져오지 못했기 때문에 에러가 난다.

이 사실을 모르고 작업하면, 아무리 xml 을 뒤져봐도 문제를 해결할 수가 없다.

이 경우는.... 구글 뒤져봐도 소용없고, StackOverflow 봐도 답없다. 그냥 끝없이 삽질하는 거임.


이상 기록 끝.



 


반응형