"Google I/O 2012 - So You've Read the Design Guide; Now What"
세션에 나온 Fragment에 관한 정보를 정리한 것입니다.
Activity와 View를 가지고도 Dynamic한 UI를 만들 수 있습니다. View와 Activity를 아래와 같이 구성한다고 생각해봅시다. 화면 구성요소를 ListView와 DetailView로 구분하고 이를 담고 있을 Activity를 생성합니다.. Single-Pane화면에서는 두개의 Activity가 사용되고 Dual-Pane구성에서는 하나의 Activity를 사용합니다.
![]() |
Activity+View를 사용한 구성 |
이렇게 구성되 있는 상태에서 카메라 기능을 사용한다고 생각해 봅시다.
카메라 기능을 사용하기 위해서는 아래와 같은 코드가 필요합니다.
Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(camera, RESULT_PICTURE_RESULT);
이런 식으로 startActivityForResult를 호출해 onActivityResult를 통해서 받은 데이터를 처리하게 될것입니다.
Activity+View를 사용한 구성에서는 위와 같은 코드가 View의 내부에 위치하게 될겁니다.(View코드를 재활용한다고 했을때요!) 하지만 코드에서 필요한 중요 기능들은 Activity의 내부에 포함되어 있습니다. ( startActivityForResult나 onActivityResult함수)
위의 그림과 같은 구성에서는 그 기능들이 ListActivity와 DetailActivity 의 onActivity에서 View로 이벤트를 위임해주는 구현이 각각 들어가야합니다. 이것은 반복적이고 매우 귀찮은 작업입니다.
또 화면별 메뉴구성을 다르게하기 위한 코드(onOptionMenuXXX 들)나 Activity LifeCycle에 의존적인 기능들, 데이터를 가져오거나 저장하기 위한 코드들을 현재 화면구성에 맞춰서 동작하게 하기위해서는 이벤트를 위임해주는 기능을 구현해주어야합니다.(ListActivity와 DetailActivity모두에!!)
이렇게 Multi-pane화면을 지원하기 위해 구현을 하다보면 Activity에선 쉽게할 수 있는 작업들을 View쪽에서 해주기 위해 귀찮고 반복적인 작업이 반복됩니다. 이를 피하기 위해 Fragment는 만들어졌습니다.
위에서 구현해야했던 모든 기능들은 이제 Fragment내부에 구현하면 됩니다. 다음과 같은 구성이 되겠죠.
![]() |
Fragment를 사용한 구성 |
Fragment는 Activity가 가진 많은 callback을 가지고 있고 Activity Lifecycle에 맞춰 그 callback들이 호출됩니다.
참 쉽죠? :)