2012년 5월 19일

안드로이드 : Tab 구현 하기




안드로이드 플렛폼에서 Tab은 다음과 같은 3가지 요소로 이루어 진다.
  • TabHost: TabWidget(Tab 버튼 모음)과 FrameLayout을 포함하는 전체 컨테이너
  • TabWidget: Tab 버튼 모음을 나타내며 각각의 Tab 버튼은 text + icon (옵션)으로 이루어 진다.
  • FrameLayout: 선택된 Tab에 따른 실제 내용(Tab content)를 위한 컨테이너. 모든 Tab content는 FrameLayout의 child임.


위에 설명한 3개의 component를 사용해 정상적으로 작동하는 Tab을 구성하기 위해서는 다음과 같은 몇 가지 숙지해야 할 사항들이 있다.
  • TabWidget의 id와 최소높이: TabWidget의 id는 항상 "@android:id/tabs"로 설정 하여야 한다. 또 TabWidget의 최소 높이는 약 62px이다. 다시 말하면 Tab 버튼은 text + icon(옵션)으로 구성되는데 text로만 구성된 Tab 버튼도 무조건 62px정도의 높이를 차지한다. 물론 사용하는 icon에 따라 더 커질 수는 있다. (너무 작은 tab은 조작이 힘들어서가 아닐까 싶다)
  • FrameLayout의 Padding: TabHost는 FrameLayout에서 상속되며 FrameLayout에서 child view들은 어떤 layout을 사용하던 FrameLayout의 좌측 상단에 배치된다(여러 child view가 있다면 제일 마지막에 배치된 child view가 나머지 view를 가려버림). 그래서 FrameLayout이 TabHost내부에 배치될 때 TabWidget을 고려하지 않고 무조건 TabHost의 최 상단에 배치 되어 TabWidget을 가려버린다. 그럼으로 사용된 TabWidget의 높이만큼 FrameLayout위쪽에 padding을 주어야 한다. (TabWidget의 최소 높이가 62px임으로 최소 padding도 62px)
  • TabActivity 사용: TabActivity상속 받아 Activity를 구현 할 때(Tab 자체가 Activity의 main 화면일 때) TabHost의 id는 항상 "@android:id/tabhost"로 설정 하여야 한다.


추가로, Java 코드에서 XML에 선언된 여러 컴포넌트를 연결해서 정상적으로 작동하는 Tab view를 만들려면
TabHost객체의 내부객체인 TabHost.TabSpec이라는 Tab building helper 객체를 이용하여야 한다.
TabHost에 새로운 Tab을 추가하는 것은 다음과 같이 5단계로 나뉜다.
  • TabHost setup 시작: findViewById 메소드를 통해 TabHost인스턴스를 얻은 후 TabHost인스턴스에 Tab을 추가하기 위해서는 반드시 TabHost인스턴스.setup() 메소드 먼저 실행 해야함. (단, TabActivity를 사용해 구현된 Tab은 setup 필요 없음)
  • helper 생성: TabHost인스턴스.newTabSpec(String형 tag이름)를 사용해 helper 객체를 생성 (추후 생성시 지정한 'tag 이름'으로 다시 소환 할 수 있음.)
  • Tab button의 text 지정: helper인스턴스.setIndicator(String / String+Icon / View)를 사용해 Tab Button의 형태를 지정.
  • Tab content 지정: helper인스턴스.setContent(View ID / TabContentFactory / Intent)를 사용해 Tab content를 지정. (TabContentFactory와 Intent는 추후 설명)
  • TabHost에 Tab객체 등록: TabHost인스턴스.addTab(helper인스턴스)로 위에서 설정 완료(tag, indicator, content)된 Tab Building helper를 TabHost에 등록.


Static한 Tab 구현
그럼 지금까지 정리한 것을 바탕으로 static(compile-time시 형태가 결정되는) 한 Tab의 구현 예제를 보자.
Static Tab 예제 (main.xml)
소스 펼치기


Static Tab 예제 (MyTab.java)
소스 펼치기


다음은 실행 화면이다.


위에서 본 예제는 Complie-Time에 Tab view의 형태가 결정된다.
하지만 경우에 따라서 run-time에 tab이 추가로 생성되어야 할 경우도 있다.
이런 경우에는 TabHost.TabContentFactory라는 TabHost의 내부객체를 사용한다.
TabContentFactory 객체는 View createTabContent(String tag)라는 abstract callback method를 포함하며,
TabContentFactory 객체 생성 시 자동으로 호출되어 결과로 Tab content를 구성하는 View를 return한다.


Dynamic 한 Tab 구현
다음은 dynamic(run-time시 동적으로 형태가 변하는)한 Tab의 구현 예제 이다.
Static Tab 예제 (main.xml)
소스 펼치기


Static Tab 예제 (MyDynamicTab.java)
소스 펼치기


다음은 실행 화면이다. 첫 Tab의 버튼을 누르면 AnalogClock이 표시되는 Tab의 추가된다.

댓글 없음:

댓글 쓰기