2012/08/14

Fragment는 왜 만들어졌을까요?

아래내용은 
"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로 모으고 귀찮은 위임작업들을 하지 않고도 쉽게 Single-Pane, Dual-Pane화면을 지원할 수 있게 되었습니다. 야호!

Fragment는 Activity가 가진 많은 callback을 가지고 있고 Activity Lifecycle에 맞춰 그 callback들이 호출됩니다.
참 쉽죠? :)