2020. 3. 1. 12:03ㆍAndroid
오늘의 개념:
Fragment - 1/2
아래의 내용들은 구글 공식문서를 바탕으로 정리한 것이다🐱👤
등장 배경 및 디자인 철학
-
Android 3.0(API level 11)에 처음으로 도입
-
태블릿과 같은 대형 스크린에서 유연한 UI를 지원하기 위해
- 아래 그림에서와 같이 태블릿에서는 2개의 Fragment를 동시에 보여줄 수 있고, 모바일에서는 1개의 Fragment씩 보임
-
Fragment는 모듈식의 재사용 가능한 구조로 만들어야 함 => Fragment는 독립된 모듈로 재사용이 가능.
-
하나의 fragment에서 다른 fraagment를 직접 조작하게 만들면 안 된다
Fragment는 언제 사용할 수 있을까?
-
태블릿과 같은 큰 화면에서
-
Tab layouts
-
BottomBar Navigation
-
Dialog Fragment
-
재사용되는 화면일 경우
-
등등
Fragment 생명주기
Fragment의 생명주기는 오른쪽 그림과 같다.
뭔가 Activity와 비슷한 거 같으면서도 되게 복잡해 보이는.. 🐱👤
자세히 보면, Activity의 생명주기 사이사이에 몇몇 함수들이 추가되어 있다. 이 함수들에 대해서는 바로 아래에서 자세히 설명하겠다.
일반적으로 Fragment를 사용할 때 onCreate(), onCreateView(), onPause()는 아래와 같은 이유로 구현해주는 것이 좋다.
onCreate()
: Fragment를 생성할 때 호출됨.
Fragment가 멈추고(paused or stopped) 새로 시작(resumed)될 때
유지하고 싶은 것들은 여기에서 초기화를 해야 함.
(예를 들어, 화면 회전이나 process kill 당했을 때 등)
onCreateView()
: Fragment에 레이아웃을 그리고 싶다면 여기서 반드시 view를 리턴해야 한다. 만약 fragment에서 UI가 필요 없다면 null을 리턴하면 된다.
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.example_fragment, container, false)
return view
}
onPause()
: 사용자가 fragment를 떠날 때 호출됨.
onPause에서는 fragment가 일부 보임. 즉 화면의 일부만 가려졌을 때.
사용자가 그대로 화면을 떠날 수도 있기 때문에 유지해야 하는 변경 사항들은 여기서 처리해줘야 함.
Activity와 Fragment의 생명주기는 아랫부분을 제외하면 거의 똑같다.
- Activity는 back stack(뒤로 가기)을 알아서 저장해주는 반면, Fragment는 addBackStack() 함수를 써서 back stack을 저장해줘야 한다. Fragment에서 addBackStack()을 사용하지 않으면 back stack은 저장되지 않음. 즉, 뒤로 가기가 자동으로 안 된다는 거.
오른쪽 그림은 Activity와 Fragment의 생명주기의 관계를 잘 나타내고 있다.
Activity와 Fragment의 생명주기는 거의 비슷하지만,
Fragment에만 존재하는 생명주기는 아래와 같다.
onAttach()
: Fragment가 Activity에 추가되었을 때 호출됨 (Activity가 전달됨)
onCreateView()
: Fragment의 view를 그릴 때 호출됨
onActivityCreated()
: 함수명 그대로 Activity의 onCreate()가 리턴됐을 때 호출됨
onDestroyView()
: onCreateView()와 반대로 Fragment의 view가 지워질 때 호출됨
onDetach()
: onAttach()와 반대로 Activity에서 떼어질(?🤣) 때 호출됨
직접 Activity와 Fragment의 생명주기가 어떻게 동작하는지 로그로 찍어보자
시나리오
1번 과정 : MainActivity 시작
2번 과정 : FragmentAcvity로 이동, FragmentAcvity에서는 FragmentA 시작
아래 로그를 보면,
예상과는 달랐던 것은 FragmentActivity와 FragmentA모두 resume() 된 후에 MainActivity의 onStop()이 호출된다는 점이다.
3번 과정 : FragmentActivity에서 FragmentA를 FragmentB로 교체
FragmentB로 교체하면 FragmentA가 모두 종료되고 이동하는 것이 아닌,
FragmentB의 onAttach, onCreate()가 먼저 호출되고 FragmentA가 종료되는 것을 볼 수 있다. 신기 ㅎㅎ
4번 과정 : FragmentActivity에서 뒤로 가기 버튼을 눌러 다시 MainActivity로 돌아감
이 과정 역시,
MainActivity가 다시 시작된 후에 FragmentActivity와 FragmentB가 완전히 종료된다. 잘 알아둡시당!
위와 같이 직접 생명주기 로그를 찍어보니 예상과는 다른 부분들이 있었다. 우리 모두 잘 알아둡시당✌️
생명주기 파악은 정말 중요하닥!!
Fragment를 직접 생성하고 데이터 전달은 어떻게 하는지 등의 사용법은 다음 블로그에서 이어가겠습니당 (_ _)
휴!
참고
https://academy.realm.io/posts/360andev-david-hope-fragments-activities-android-beginner/
'Android' 카테고리의 다른 글
[Android] Android 10 - 카메라와 갤러리에서 이미지 가져오기 (0) | 2020.05.27 |
---|---|
[Android] BottomNavigationView ripple 효과 (4) | 2020.03.20 |
[Android] DI(의존성 주입)과 Koin에 대하여 (0) | 2019.11.15 |
[Android]Android Architecture Pattern 에 대하여 - (2) MVVM (0) | 2019.10.08 |
[Android] Android Architecture Pattern 에 대하여 - (1) (0) | 2019.09.28 |