본문 바로가기

Programming/Android

Fragment - 1. 서론



Fragment는 동작 또는 Activity 내에서 사용자 인터페이스의 일부를 나타낸다. 여러 개의 프래그먼트를 하나의 액티비티에 조합하여 창이 여러 개인 UI를 구축할 수 있으며, 하나의 프래그먼트를 여러 액티비티에서 재사용할 수 있다. 프로그먼트는 자체 수명주기를 가지고, 자체 입력 이벤트를 받으며, 액티비티 실행 중에 추가 및 제거가 가능한 액티비티의 모듈식 섹션이라고 생각하면 된다.(다른 Activity에 재사용할 수 있는 "하위 액티비티"와 같은 개념).


Fragment는 항상 액티비티 내에 포함되어 있어야 하며 해당Fragment의 수명 주기는 Host Activity의 수명 주기에 직접적으로 영향을 받는다. 예를 들어 Activity가 일시정지 되는 경우, 그 안의 모든 Fragment도 일시정지되며 Activity가 소멸되면 모든 Fragment도 마찬가지로 소멸된다. 그러나 Activity가 실행 중인 동안에는 각 Fragment를 추가 또는 제거 하는 등 개별적으로 조작할 수 있다. 그와 같은 Fragment Transaction을 수행할 때에는 이를 Activity가 관리하는 백 스택에도 추가할 수 있다. 각 백 스택 항목이 발생한 Fragment Transaction의 기록이 된다. 이 백 스택을 사용하면 사용자가 Fragment Transaction을 거꾸로 돌릴 수 있다.


Fragment를 Activity Layout의 일부로 추가하는 경우, 이는 Activity의 view계층 내부의 viewGroup 안에 살며, 해당 Fragment가 자신의 view layout을 정의한다. Fragment를 Activity Layout에 삽입하려면 해당 Fragment를 Activity Layout파일에서 <fragment> 요소로 선언하거나, Application 코드에서 이를 기존의 ViewGroup에 추가하면 된다. 그러나 Fragment가 Activity Layout의 일부여야만 하는 것은 아니다. 나름의 UI가 없는 Fragment 도 Activity를 위한 보이지 않는 작업자로 사용할 수 있다.

본디 Fragment는 태블릿같은 큰 화면에서 조금 더 역동적이고 유연한 UI 디자인을 지원하도록 설계되었다. 태블릿은 구성 요소가 들어갈 공간이 많기 때문에 더욱 다양한 UI구성이 가능했고 Fragment는 개발자가 이러한 공간을 조금 더 효율적으로 사용할 수 있도록 도움을 줄 수 있다. Activity는 하나의 화면에 여러개 사용할 수 없게 설계가 되어 있다. Activity마다 생명 주기를 가지고 있기 때문이다. 그렇기 때문에 Activity내에 Fragment를 만들 수 있게 하여 보다 유연한 설계가 가능하게 된 것이다.


Fragment 특징


- Fragment는 Activity 안에서만 존재할 수 있고 단독으로 존재할 수 없다.

- Fragment는 Activity 안에서 다른 view와 함께 존재할 수 있다.

- Fragment는 Back stack을 사용할 수 있다.

- Fragment는 반드시 default 생성자가 있어야 한다.


Fragment 생명주기




Fragment를 생성하려면 Fragment의 서브 클래스(또는 이의 기존 서브클래스)를 생성해야 한다. Fragment 클래스에는 Activity와 아주 유사한 형식의 콜백 메서드가 들어있기 때문에 Activity 생명주기를 제대로 숙지했다면 그리 어렵지 않을 것이다.


- onAttach()

  onAttach()콜백 메소드는 Fragment가 Activity에 추가되고 나면 호출된다. 이 때 Activity가 파라미터로 전달된다.


- onCreate()

  시스템은 프래그먼트를 생성할 때 이것을 호출한다. 구현 내에서 Fragment의 기본 구성 요소 중 Fragment가 일시 정지 되거나 중단되었다가 재개되었을 때 유지하고자 하는 것을 초기화해야 한다. 


- onCreateView()

  Fragment에 실제 사용할 뷰를 만드는 작업을 하는 메소드이다. LayoutInflater를 인자로 받아서 Layout으로 설정한 xml을 연결하거나 bundle에 의한 작업을 하는 메소드이다.


- onPause()

  시스템이 이 메서드를 호출하는 것은 사용자가 Fragment를 떠난다는 첫 번째 신호다. (항상 Fragment가 사라진다는 뜻은 아님)