이번 시간부터는 드디어 자바를 통해 레이아웃을 제어하는 방법을 배웁니다~
사실상 지금부터가 진짜 안드로이드 프로그래밍이죠!
Hello World를 만들 때 액티비티에 대해서 잠깐 설명했었죠?
오래되어 잊어버린 분들도 있을 수 있으니 다시 한 번 설명하겠습니다.
액티비티는 앱을 구성하는 수많은 화면 중 하나의 화면을 가리키는 말입니다.
여러 개의 뷰가 하나의 액티비티를 이루고, 여러 개의 액티비티가 모여 하나의 앱을 이루는 거죠.
일반적으로 앱은 최소한 한 개 이상의 액티비티를 가지고 있습니다.
MainActivity.java 파일로 이동합시다.
MainActivity.java는 저번에 설명해드렸듯이 메인 액티비티를 제어하는 자바 코드가 담긴 파일입니다.
역시 IDE가 만들어 준 코드라 그런지 상당히 지저분합니다.
실습에 방해 되므로 위와 같이 onCreate만 남기고 다 날려버립시다. :)
일단, 액티비티는 위처럼 Activity 클래스를 상속하는 클래스의 형태로 만듭니다.
onCreate는 액티비티가 만들어지고 화면에 나타나기 직전에 호출되는 메서드입니다.
초기화 처리를 하기 매우 적합한 곳이기 때문에 액티비티의 99.99%는 이 메서드를 오버라이딩합니다.
onCreate의 첫 줄에서는 super 메서드를 호출하여 액티비티의 시스템적인 요소를 초기화 하고 있습니다.
다음 줄에서는 setContentView라는 메서드를 호출하고 있는데, 이것은 액티비티에 사용할 레이아웃을 지정하는 메서드로,
이 코드로 인해 메인 액티비티와 우리가 짰던 레이아웃이 연결됩니다.
첫번째 인자로 'R.layout.지정할레이아웃파일이름'을 주면 됩니다.
참고로 R.layout.지정할레이아웃파일이름 은 int형 값입니다.
프로젝트에 레이아웃 파일을 추가하면 안드로이드 스튜디오가 자동으로 'R'이라는 클래스에 레이아웃 파일 이름을 추가합니다.
요로코롬 말이죠!
때문에 레이아웃 파일에 공백이나 특수문자 같이 Java에서 변수로 표현할 수 없는 이름을 지정하면 R.java가 통째로 사라져버리며
'R.~.~'가 들어간 모든 코드에 빨간 줄이 그어지는 멘붕적인 상황이 발생합니다.
잠깐 'R'에 대한 얘기를 해볼까요?
우리가 짠 레이아웃 파일은 aapt라는 리소스 컴파일러에 의해 컴파일 된 뒤 id를 부여받게 되는데,
그 아이디가 'R'이라는 이름을 가진 클래스에 자동으로 저장됩니다.
R 클래스가 담겨 있는 R.java는 IDE가 자동으로 만들어주는 특수 파일로, 원래는 'gen'이라는 특수 폴더에 상주하고 있어
열어볼 수 있었으나 안드로이드 스튜디오에서는 함부로 조작하지 말라는 것인지 아예 숨겨 버렸네요.
사실 R.java 파일을 건드려서 얻을 수 있는 건 오류밖에 없지만요. -_-...
***** 2015년 1월 4일 추가됨 *****
프로젝트 폴더를 뒤적뒤적해서 마침내 R.java를 찾아냈습니다.
R 클래스는 이렇게 종류별로 나누어진 수많은 static 이너 클래스로 이루어져 있습니다.
그중 레이아웃과 관련된 id는 layout이라는 이너 클래스에 레이아웃 파일 이름을 딴 int형 필드 형태로 저장됩니다.
자세히 보면 노란 박스친 layout 이너 클래스에 메인 액티비티의 레이아웃 파일이 있는 것을 볼 수 있습니다.
그래서 'R.layout.레이아웃파일이름' 형태로 접근할 수 있는 것이지요.
(참고로 레이아웃 파일에 공백이나 특수문자 같이 Java에서 변수로 표현할 수 없는 이름을 지정하면 R.java가 통째로 사라져버리며
'R.~.~'가 들어간 모든 코드에 빨간 줄이 그어지는 멘붕적인 상황이 발생합니다.)
다시 한번 말씀드리지만, R.layout.activity_main은 그냥 int형 값에 불과합니다.
그리고 R.java는 레이아웃 파일이 변경될 때마다 자동으로 갱신되니 절대 함부로 열어서 편집하지 마세요!
이를 어길 시 발생할 수 있는 일은 장담 불가
****************************
마지막으로 AndroidManifest.xml에 액티비티의 존재를 알려야 시스템이 액티비티를 인식합니다.
아무리 열심히 레이아웃을 짜고 액티비티 클래스를 구현해도 이곳에 등록하지 않으면
아예 존재 자체가 없는 것으로 간주되어 버립니다.
액티비티는 <activity/> 태그의 name 속성을 지정하여 등록합니다.
메인 액티비티는 기본적으로 등록이 되어 있습니다.
여기서 주의할 점은
사진처럼 액티비티가 앱 패키지와 동일한 패키지에 있을 때는 단순히 .MainActivity를 입력하면 되지만,
액티비티가 예를 들어 'component.ui' 같이 임의의 패키지에 있으면
component.ui.MainActivity 같이 풀 네임을 입력해야 한다는 것입니다.