Fragment란?
Fragment = Activity + View라고 볼 수 있다. 즉, Activity의 개념과 View의 개념이 합쳐진 것이다.
Activity와 View의 개념을 떠올려보자.
- View: 레이아웃, 위젯과 같이 액티비티 상에서 틀을 잡거나, 우리에게 보이는 버튼, 뷰 등등
- Activity: View를 담을 수 있는 화면
그렇다면 Fragment는 무엇일까?
Fragment는 Activity가 담을 수 있는 또 다른 화면이라고 생각하면 된다.
이제 다음과 같은 생각이 들 수 있다. "어? Activity와 Fragment가 둘 다 화면이라면 굳이 구분을 해야 할까? 그냥 Activity만 쓰면 안될까?" 이제부터 이 궁금증을 해결해보자.
- Activity는 Fragment에 비해 상당히 무겁고, 리소스를 많이 잡아먹는다.
- 하나의 Activity에서 A화면, B화면, C화면 등 다양한 화면으로 화면 전환을 해야 할 때, Fragment를 사용하면 보다 효율적이다. 대부분의 프로젝트는 Single Activity - Multi Fragment 형태를 가지고 있다.
- 태블릿처럼 화면이 클 때, 같은 애플리케이션이더라도 Activity의 구성이 다른 것을 종종 확인할 수 있다. 아래의 그림에서 왼쪽은 스마트폰, 오른쪽은 태블릿의 Play Store 화면이다. 이처럼 두 화면의 구성이 다른 이유는 한 Activity의 화면 요소를 Fragment 단위로 나누어 관리하였기 때문이다. 이를 통해 레이아웃을 분리해 관리할 수 있고, 복잡도를 줄일 수 있다.
Fragment의 특징
- Activity를 분할하여 화면의 각 부분들을 정의한다.
- 다른 Activity에서 재사용이 가능하다.
- Activity와 같이 레이아웃, 동작처리, LifeCycle(생명주기)이 있다.
- Activity 실행 중 생성, 교체, 삭제가 가능하다.
- 무조건 Activity에 종속되어야 한다.
Fragment 생명주기
각각의 기능들에 대해 알아보자.
onCreate()
Fragment가 Activity에 Attach될 때 호출된다.
즉, FragmentManager에 Fragment가 전달되었을 때 onCreate() 콜백 함수를 호출한다.
onCreateView()
Fragment가 View를 그리기 위한 콜백으로, 레이아웃을 inflate하는 곳이다.
View의 초기값을 설정하는 로직이 들어가며, 따라서 반환값도 View다.
다만 UI를 아직 설정하지 않았다면 null을 반환하기도 한다.
onViewCreated()
onCreateView()가 호출된 후 onViewCreated()가 호출된다.
onViewCreated()가 호출된 시점부터 Fragment View의 생명 주기가 Initialized 상태로 업데이트되므로 View의 초기값을 설정해주기 적절하다.
onViewStateRestored()
Fragment에 속하는 View들의 상태 값을 모두 읽어왔을 때 호출된다.
예를 들어, 체크 박스 위젯이 현재 체크된 상태인지 등 각 뷰의 상태를 체크할 수 있다.
onStart()
Fragment가 사용자에게 보여질 때 호출된다.
Fragment 안에 또 다른 Fragment가 있을 때, onStart() 부분에서 FragmentManager를 통해 FragmentTransaction 수행이 가능하다.
onResume()
onResume()이 호출되고부터 사용자와 Fragment가 상호작용이 가능하다.
onPause()
사용자가 Fragment를 떠날 때, onPause()가 호출된다.
onStop()
사용자가 Fragment를 떠나 더 이상 보이지 않게 되면 호출된다.
사용자가 해당 Fragment를 다시 호출하면 복원 가능하다.
onSaveInstanceState()
Fragment에 현재 동적 상태를 저장하도록 요청하기 위해 호출된다.
후에 프로세스가 다시 시작될 경우 새 인스턴스에서 재구성할 수 있다.
프래그먼트의 새 인스턴스를 만들어야 하는 경우 이 콜백의 Bundle에 배치한 데이터를 onCreate, onCreateView 및 onViewCreated의 Bundle에서 사용할 수 있다.
onDestroyView()
Fragment와 관련된 View가 완전히 벗어났을 경우 호출된다.
onDestroy()
onDestroyView()에서 View가 제거된 후에 호출된다.
간단하게 Fragment를 이용한 화면 전환을 구현하여 LifeCycle이 어떻게 작동되는지 알아보도록 하자.
구현
https://github.com/junsu1023/Android-Study/tree/fragment
GitHub - junsu1023/Android-Study
Contribute to junsu1023/Android-Study development by creating an account on GitHub.
github.com
코드를 확인하고 싶다면 깃허브에서 위의 깃허브에서 확인하면 된다.
Fragment 호출 시
onCreate() -> onCreateView() -> onViewCreated() -> onViewStateRestored() -> onStart() 순으로 호출되는 것을 확인할 수 있다.
FragmentA에서 FragmentB로 전환 시 FragmentA의 LifeCycle 상태
onPause() -> onStop() -> onDestroyView() -> OnDestroy() 순으로 호출되는 것을 확인할 수 있다.
FragmentA가 화면에서 완전히 사라지므로 onDestroy()까지 호출된다.
다시 FragmentA로 전환
onCreate() -> onCreateView() -> onViewCreated() -> onViewStateRestored() -> onStart() 순으로 호출되는 것을 확인할 수 있다.
즉, Fragment가 처음부터 생성된 것이다.
FragmentA 상태에서 앱을 나갔을 때
onPause() -> onStop() -> onSaveInstanceState() 순으로 호출된다.
앱에 다시 접속
onStart() -> onResume() 순으로 호출된다.
'Android' 카테고리의 다른 글
[Android] AlertDialog를 이용한 알림 창 띄우기 (0) | 2022.08.17 |
---|---|
[Android] 화면 회전할 때 데이터 처리 (0) | 2022.08.17 |
[Android] Activity LifeCycle(액티비티 생명주기) (0) | 2022.08.14 |
[Android] Toast Message(토스트 메세지) (0) | 2022.08.14 |
[Android] Intent란?, Intent를 이용한 화면 전환하기 (0) | 2022.08.13 |
댓글