본문 바로가기

Android/Fragment

[Android] Fragment(프래그먼트) for Honeycomb



 Fragment란?

Fragment는 Activity만으로는 표현이 어려운 것들을 해결하기 위해 나온 녀석이라고 할 수 있을것 같습니다.

기존의 탭 액티비티에서 탭을 클릭하는 것이 아닌, 하나의 탭 컨텐츠 안에서 화면을 전환하기 위해서는,
ActivityGroup같은 것을 써서 Activity를 View로 만들어 사용하곤 했었습니다.

하지만 이런 경우 Decor되기 위한 View로 변환(.getDecorView())되어 버린 액티비티들은,
원래 액티비티가 가지고 있는 라이프 사이클을 완전하게 수행하지 못하게 되어버렸습니다.

그래서 Intent 플래그 중 FLAG_ACTIVITY_CLEAR_TOP 을 써서 계속해서 새로 호출하며 화면을 갱신하는 방법을 택하지 않았었나 생각되구요. (기본적으로 생성:onCreate()onDestroy()과 파괴:onDestroy()는 수행이 됨)
ActivityGroup이라는 공통의 부모가 있기는 하지만, 자식 액티비티들간의 데이터의 교환도 어려웠구요.

어쨋든 이런 문제점들과,
태블릿의 특성인 한 화면 안에서 여러개의 액티비티를 동시에 보여주는것에 적합하게 나온것이 Fragment입니다.

액티비티 대신에 Fragment라는 녀석으로 조각 조각 따로 만들어 주는 거지요. 


예전 방식이 리스트를 보여주는 액티비티 A에서 뭔가를 눌렀을 때, 그 내부 컨텐츠를 보여주는 액티비티  B로 이동하는 형식이었다면, Fragment는 한번에 리스트와 컨텐츠를 동시에 한 화면에서 볼 수 있게 해 주는 것입니다.
이때 왼쪽의 리스트 부분을 하나의 fragment로, 오른쪽의 컨텐츠 부분을 다른 하나의 fragment로 구성을 해주고,
이 둘을 가지고 있는 Activity가 존재하는 것이지요.



 ActivityGroup에서의 Child Activity와 비교하여

생각해보면, ActivityGroup과 개념이 많이 다르지 않습니다.
ActivityGroup은 Child Activity들을 View로 만들어서 화면에 보여주는 것이라면,
Honeycomb에서는 View대신에 Fragment라는 것을 사용해서 Activity와 유사한 방식의 Lifecycle을 갖는 조금 다른 뷰를 만들어내서 화면에 보여주는게 된것이죠.

Activity 기반의 Lifecycle을 가지고 있기 때문에, 실제 액티비티 하나를 운용하는것 처럼 사용하면 됩니다.
 Fragment Lifecycle 관련 post
 http://croute.me/487
 http://croute.me/491 

Fragment는 일반 객체처럼 new 키워드를 사용해서 생성하게 됩니다. 
기존에 액티비티에서 사용하는 startActivity와는 조금 다르죠. 

또 한화면에 여러개의 Fragment를 동시에 보여줄 수 있기때문에, 한번에 보여지는 Fragment들간에 데이터 교환이 빈번하게 발생하게 되는데, Activity에서 하듯이 intent를 통해서 하는게 아닌, interface를 통해서 데이터를 교환하면 되기 때문에 상당히 편리해진것을 느낄 수 있습니다.



 Fragment의 생성, Activity에 붙이기(Attach)

기본적인 Honeycomb, 태블릿 UI를 구성을 생각하면, 좌측에 리스트가 보이고, 우측에 리스트에서 선택한 컨텐츠가 보이는 형식일겁니다.

간단한 예제를 만들기 위해, 아래와 같이 세개의 클래스를 만들어줍니다.

ExampleFragmentActivity extends Activity
ExampleListFragment extends Fragment
ExampleContentFragment extends Fragment




생성은 일반적인 자바 객체를 생성하듯 new 를 사용해서 생성해줍니다.

// 왼쪽의 List로 사용할 ExampleListFragment를 생성한다.
ExampleListFragment listFragment = new ExampleListFragment(); 

액티비티에 붙이는 건, FragmentTransaction의 replace메소드를 이용합니다.

// FragmentTransaction의 replace메소드를 통해, 액티비티에 붙인다.
ft.replace(R.id.example_fragment_activity_ll_list_fragment, listFragment, TAG_LIST); 



 Activity로부터 Fragment 가져오기

Activity의 어느 메소드라도, Fragment를 액티비티에 붙인 이후에는,
아래와 같은 코드를 통해 Activity에 붙어있는 Fragment를 가져올 수 있습니다.
이때 String tag를 사용해서 가져올 수 있습니다.
태그는 위에서 액티비티에 프래그먼트를 붙일 때 사용했던 태그입니다.





 Fragment의 onCreateView(LayoutInflater, ViewGroup, Bundle)

아래의 코드는 ExampleListFragment의 onCreateView 메소드 입니다.



메소드 내의 첫번째 줄과 마지막 줄을 제외하고 본다면, 일반적으로 액티비티의 onCreate 메소드에서 사용하는 것과 같은 방식으로 사용할 수 있습니다.
주의할점은 만든 View 객체를 return 해주는것 정도입니다.



글이 너무 길어져서 이정도로 끝내야겠네요.

다음에는  interface를 사용해서 Fragment와 Activity간의 데이터 교환, Fragment - Activity - Fragment의 데이터교환에 관련된 내용과, ActionBar에 대해서 다뤄보도록 하겠습니다.


'Android > Fragment' 카테고리의 다른 글

[Android] Fragment(프래그먼트) for Honeycomb  (5) 2011.10.28
[Android] Fragment Lifecycle(With Activity)  (1) 2011.10.17
[Android] Fragment Lifecycle  (1) 2011.10.14