안드로이드 앱에서는 가급적 문자열을 직접 지정하지 말고 리소스로 만드는 것을 권장하고 있다. 그래야 국제화/지역화 작업이 용이하기 때문이다. 위와 같은 에러가 발생하면, 프로젝트/res/values/string.xml에 적당한 이름의 변수를 추가하고 원하는 문자열을 그 변수의 값으로 지정하면 된다.
안드로이드 개발자 사이트의 String Resources 페이지에 다음과 같이 설명되어 있다.
XML에서는 ”@string/button_string”이라면 Java 코드로는 R.string.button_string이 된다. XML에서는 쌍따옴표로 묶어야 컴파일 오류가 발생하지 않는다는 점을 주의한다.
Eclipse가 디폴트로 지정해주는 문자열이 리소스가 아닌 문자열 리터럴이라는 점은 아이러니하다.
문자열의 값 중에 홑따옴표(apostrophe)가 escape되지 않아서 발생한 문제이다. 리소스와 관련된 설정파일과 코드가 정상적으로 컴파일되지 않을 수 있으니 이 문제는 반드시 해결해야 한다. 에러 메시지에 나온 것처럼 역슬래시(\)를 홑따옴표 앞에 붙여주면 된다.
다음과 같은 상태로 에뮬레이터가 실행되고 Ctrl+F11(또는 NumPad7, Fn+Ctrl+F11) 등의 오리엔테이션 변경 키로도 정상적인 포트레이트 모드(세로 모드)로 돌아오지 않는 증상이 발생한다면, 종종 에뮬레이터의 런처까지 crash하는 심각한 상황이 초래되기도 한다.
Android Virtual Device Manager 창을 열어서 사용하고 있는 가상 장치를 선택하고 Edit 버튼을 눌러 편집창을 열고 “Hardware keyboard present”를 끄면 해결된다.
ADT를 사용하는 경우에 발생했다면, ADT가 업데이트되면서 라이브러리 의존성이 깨졌기 때문에 생긴 문제로 볼 수 있다. 특히, ADT v22부터 Android Private Libraries가 분리되면서 기존 프로젝트가 빌드되지 않는 경우가 많다.
우선, SDK Manager를 실행해서 Android SDK Build-tools를 설치한다. 그러면 대부분의 컴파일 에러가 사라질 것이다.
아직 컴파일 에러(ClassNotFound Exception)가 남아 있다면 Build Path에 Android Private Libraries를 추가로 활성화하면 해결될 것이다.
R 클래스는 AndroidManafest.xml에 패키지를 선언하면 자동으로 생성되는 파일이기 때문에 프로젝트를 clean하고 다시 build하면 gen 디렉토리에 R.java라는 파일로 자동 생성된다. R.java가 생성되면 “R cannot be resolved to a variable” 에러는 자연스럽게 사라질 것이다.