상세 컨텐츠

본문 제목

[안드로이드 프로그래밍] - 프래그먼트(Fragment), 프래그먼트 생명주기

프로그래밍/안드로이드 프로그래밍

by 발랄하고 우울한 청춘 2016. 2. 5. 06:15

본문

728x90
반응형
SMALL


 

안드로이드 프로그래밍

 

안드로이드 프래그먼트(Fragment), 프래그먼트 생명주기

 


 

 

  1. 프래그먼트(Fragment) 개념

  동작 또는 Activity 내에서 사용자 인터페이스의 일부, 액티비티보다 더 작은 화면 단위를 정의하고, 여러개의 프래그먼트를 조합하여 창이 여러개인 완성된 UI화면을 표현한다. 하나의 프래그먼트를 여러 액티비티에서 재사용할 수 있으며, 자체 생명주기를 가지고, 자체 입력 이벤트를 받으며, 액티비티 실행 중에 추가, 제거, 교체가 가능하여 동적이고 유연한 화면을 만들 수 있다. 프래그먼트는 액티비티의 모듈식 섹션 혹은 다른 액티비티에서 재사용 할 수 있는 하위 액티비티라고 생각하면 된다.

 원래는 Android 3.0(API : 11)에 태블릿의 이점을 활용하기 위해 도입된 기법이지만, 4.0 이후에는 SDK가 통합되어 핸드셋에도 적용할 수 있다.

 

  2. 프래그먼트 특징

  

  • 액티비티를 분할하여 화면의 한 부분을 정의한다

  • 자신만의 레이아웃, 동작, 생명주기를 가진 독립적인 모듈이다

  • 여러 액티비티에서 재사용이 가능하다

  • 실행 중에 추가, 제거, 대체가 가능하여 잠시 숨길 수도 있다

 

  3. 프래그먼트 생명주기

 

 프래그먼트는 기능적으로 독립적인 모듈이지만 독립적으로 화면에 나타날 수는 없다. 액티비티의 구성원으로서 화면에 표시될 수 있다. 그러므로 기본적으로는 액티비티의 생명주기에 따르고 자신도 고유한 생명 주기를 가진다. 액티비티가 시작되어야 프래그먼트도 동작을 시작하며, 액티비티가 멈추면 소속된 모든 프래그먼트도 같이 멈춘며, 액티비티가 소멸되면 모든 프래그먼트도 소멸된다.  그러나 액티비티가 실행 중인 동안에는 각 프래그먼트를 추가, 제거 등 개별적으로 조작할 수 있다.

 프래그먼트 콜백 중 onCreate, onCreateView, onPause 콜백은 거의 필수적으로 구현해야 한다. 나머지는 필요할때 구현해도 좋다. 액티비티가 생성될 때 프래그먼트의 콜백이 순서대로 호출되며 프래그먼트를 초기화한다.

 

<프래그먼트 생명주기 (출처 : 안드로이드 프로그래밍 정복 2)>

 

  • void onAttach(Antivity activity)

 액티비티에 프래그먼트가 처음 부착될 때 호출된다. 인수로 전달되는 액티비티는 프래그먼트가 배치되는 호스트 액티비티이다. 프래그먼트는 항상 액티비티의 한 부분으로 사용되며 단독으로 사용할 수 없다. 인수로 전달된 activity가 바로 부모 액티비티 이다. activity 인수는 저장하지 않더라고 프래그먼트의 getActivity 메소드로 다시 얻을 수 있기 때문에, 프래그먼트는 액티비티의 모든 공개 맴버를 언제든지 사용할 수 있다.

 

  • void onCreate(Bundle savedInstanceState)

 프래그먼트를 생성할 떄, 즉 처음 부착될 때 호출된다. onCreate시 일시정지되거나 중단되었다가 재개되었을 때 유지하고자 하는 것을 초기화하고, 초기화가 필요치 않다면 생략해도 된다. 이 단계에서는 부모 액티비티도 초기화중인 상태이기 때문에, 액티비티 참조가 필요하다면 완전히 초기화된 시점인 onActivityCresated 콜백을 사용한다.

 onCreate 인수로 전달되는 savedInstanceState는 프래그먼트가 재생성되기 전 상태이며, 이 값을 참조하여 이전 상태로 복구한다.

 프래그먼트에 메뉴를 추가하고자 onCreate에서 setHasOptionsMenu 메소드로 메뉴가 있다는 것을 미리 밝힌다. 그러면 액티비티와 동일하게 onCreateOptionsMenu가 호출되며 메뉴를 전개할 수 있다. 프래그먼트의 메뉴는 액티비티의 기존 메뉴에 추가된다

 

  • View onCreateView

  (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)

 프래그먼트가 UI를 처음 그릴 때 호출된다. 프래그먼트는 자신의 레이아웃을 생성한 후 root view를 리턴한다.(단, UI가 없는 프래그먼트는 null을 리턴한다)

 레이아웃은 보통 XML 파일로 정의하고 전개해서 생선하는데 첫번쨰 인수인 inflater로 전개자가 전달되므로 전개자를 따로 구하지 않아도 된다. 두번쨰 인수 container는 프래그먼트가 배치될 액티비티의 뷰이며 액티비티의 위치에 프래그먼트가 생성 및 배치된다. 이 콜백에서 리턴한 레이아웃이 액티비티의 container 영역에 나타난다

 

  • void onActivityCreate(Bundle savedInstanceState)

  부모 액티비티가 완전히 초기화되고 프래그먼트의 레이아웃도 완성되었을 때 호출된다. 모든 초기화가 완료된 상태이므로 이 메서드에서 뷰의 상태를 복구하는 동작 등을 안전하게 실행할 수 있으며, 액티비티의 다른 위젯을 참조하거나 조작할 수 있다

  onAttach -> onCreate -> onCreateView -> onActivityCreate 4개의 콜백이 차례대로 실행한 후 onStart와 onResume이 연이어 호출된다. 이 두 콜백은 액티비티의 콜백과 같은 시점에 호출되고 의미도 동일하다. 이후 프래그먼트는 실행을 시작하여 고유 기능을 수행한다. 


  • void onPause()

        프래그먼트가 정지될 때 호출된다. 정지한다는 의미가 반드시 파괴를 의미하는 것은 아니지만,     정지된 후 다시 돌아온다는 보장이 없으므로 사중요 정보를 저장해주어야 한다. 주로 영구 정보를         저장한다.


  • void onSaveInstanceState(Bundle outState)

 생명주기 메서드는 아니지만 onPause와 함께 호출되며 이 메서드를 임시 정보를 저장한다. 임시 변수로 전달된 outState에 정보를 저장하면 프래그먼트가 재생성될 때 다시 전달된다. 액티비티와는 달리 반대 매서드인 onRestoreInstanceState 메서드는 제공되지 않으며 대신 생성단계의 세 콜백 매서드로 저장된 정보다 전달된다


  • 액티비티 파괴

   액티비티가 파괴될 때는 onDestroyView, onDestroy, onDetach 콜백이 순서대로 호출된다. 프래그   먼트 생성시에 할당한 자원이 있다면 이 시점에서 해제한다. 특별히 초기화한 자원이 없다면 굳이 재   정의 하지 않아도 된다.

 


 

*참고자료 : 안드로이드 프로그래밍 정복2, http://developer.android.com/intl/ko/guide/components/fragments.html

 

 

반응형
LIST

관련글 더보기

댓글 영역