밑빠진 지식에 블로그 쓰기

Fragments 본문

카테고리 없음

Fragments

쓰는녀석 2023. 3. 27. 11:36

Activity와 Intent는 유용한 navigation 패턴이지만 너의 앱을 위한 동적 사용자 인터페이스를 만드는 것중 일부이다.

 

많은 Android앱은 모든 화면에 대해 별도의 Activity가 필요하지 않다.

실제로 Tab과 같은 많은 일반적인 UI 패턴은 Fragment라는 것을 사용하여 Single Acitiviy내에 존재 합니다.

 

Fragment는 이름에서 유추할수 있든 재사용가능한 UI 조각이다.

Fragment는 재사용할수 있고, 하나 이상의 활동에 포함 될수 있다.

위 스크린샷에서 탭을 탭하는것이 다음 화면을 보여주기위해 Intent를 발생시키지 않는다.

그대신에  탭을 바꾸는 것은 이전 Fragment에서 다른 Fragment로 간단히 교체 한다.

이 모든것들은 다른 Acitivy를 시작하지 않고 발생한다.

 

심지어 한화면에 여러  Fragment를 보여줄수 있다.

아래 예시에서 왼쪽의 탐색 UI와 오른쪽의 콘텐츠는 각각 별도의 프래그먼트에 포함된다.

두 프래그먼트는 동일한 Activity에서 동시에 존재 한다.

 

Fragment는 고풀질 앱을 만드는데 필수적인 부분입니다.

Fragment는 단순히 앱의 UI의 재사용 가능한 부분이다.

Acitivity처럼 Fragment도 수명주기가 있고, 사용자 입력에 응답할 수 있습니다. 사용자와 상호작용 가능합니다.

Fragment는 화면에 표시될 때 Acitivity의 뷰 계층 구조 안에 존재 해야 합니다.

재사용성과 모듈성을 강조하기 떄문에 하나의 Acitivity에 동시에 여러 Fragment를 호스팅하는것도 가능합니다.

각 Fragment는 별도의 자체 수명 주기를 관리합니다.

 

Acitivity와 마찬가지로 Fragment는 초기화되고 메모리에서 제거 될수 있습니다.

Fragment가 존재하는 동안 화면에 나타나고 사라지고, 또 다시 나타날 수 있습니다.

 

Acitivity와 마찬가지로 여러상태의 lifecycle이 있고 상태 사이의 전환에 응답하기 위해 재정의할 수 있는 여러 메서드를 제공합니다. 

 

Fragment lifecycle는 Lifecycle.State enum로 나타나는 5가지 상태가 있습니다.

INITIALIZED: 프래그먼트의 새 인스턴스가 인스턴스화되었습니다.

CREATED: 첫 번째 프래그먼트 수명 주기 메서드가 호출됩니다. 이 상태 동안 프래그먼트와 연결된 뷰도 생성됩니다.

STARTED: 프래그먼트는 화면에 표시되지만 "포커스"가 없으므로 사용자 입력에 응답할 수 없습니다.

RESUMED: 프래그먼트가 표시되고 포커스가 있습니다.

DESTROYED: 프래그먼트 개체가 인스턴스화되지 않았습니다.

 

Acitivity과 마찬가지로 Fragment 클래스는 수명 주기 이벤트에 응답하기 위해 재정의할 수 있는 많은 메서드를 제공합니다.

onCreate() : CREATED 상태에 있고, 프래그먼트가 인스턴스화 되어 있음. 그러나 아직 프래그먼트에 대응하는 뷰는 아직 생성되지 않았음

 

onCreateView(): xml에 정의된 레이아웃을 inflate시키는곳. 프래그먼트가 CREATED상태가 된다.

onViewCreate(): 뷰가 생성된뒤에 호출된다. 일반적으로 이 메서드에서   findViewById() 뷰바인딩을 이용하여 특정뷰에 속성을 바인딩한다.

 

onStart(): 프래그먼트가 STARTED 상태가 되었습니다.=> 화면에 보인다 포커스 x

onResume(): 프래그먼트가 RESUMED 상태에 진입했으며 이제 포커스가 있습니다(사용자 입력에 응답할 수 있음).

onPause(): 프래그먼트가 STARTED 상태로 다시 들어갔습니다. UI는 사용자에게 표시됩니다.

onStop(): 프래그먼트가 CREATED 상태로 다시 들어갔습니다. 개체가 인스턴스화되지만 더 이상 화면에 표시되지 않습니다.

onDestoryView() : 프래그먼트가 DESTROYED 상태에 들어가기 직전에 호출됩니다. 뷰는 이미 메모리에서 제거되었지만 프래그먼트 객체는 여전히 존재합니다.

onDestory(): 프래그먼트는 DESTROYED 상태가 됩니다.

 

아래 차트에는 프래그먼트 수명 주기와 상태 간 전환이 요약되어 있습니다.

 

수명 주기 상태 및 콜백 메서드는 활동에 사용되는 것과 매우 유사합니다.

하지만 그러나 onCreate() 메서드와의 차이점에 유의하십시오.

 

엑티비티에서는 onCreate()에서 레아이웃을 인플레이트 했고 뷰를 결합시켰다.하지만 프래그먼트 onCreate()는 뷰가 생성되기 전에 호출되어서 레이아웃을 인플레이트 할수 없다.onCreateView()에서 뷰를 인플레이트 하고 뷰가 인플레이 되었으면onViewCreate()에서 특정 뷰에 속성을 결합시킬수 있다.

 

프레그먼트의 뷰바인딩 객체가 nullable인 이유 => onCreateView()가 호출되기 전까지 레이아웃이 인프레이트 되지 않기 때문

LetterListFragment 인스턴스가 생성되는 시점(생명주기가 onCreate()로 시작되는 시점)과 이 속성을 실제로 사용할 수 있는 시점 사이에 시간이 있습니다. 또한 프래그먼트의 뷰는 프래그먼트의 수명 주기 전체에서 여러 번 생성되고 소멸될 수 있음을 명심하십시오. 이러한 이유로 다른 수명 주기 메서드인 onDestroyView()에서도 값을 재설정해야 합니다.

 

참고

Kotlin 및 일반적인 프로그래밍에서는 속성 이름 앞에 밑줄이 오는 경우가 종종 있습니다.

이는 일반적으로 속성에 직접 액세스할 의도가 없음을 의미합니다.

바인딩 속성을 사용하여 LetterListFragment의 뷰 바인딩에 액세스합니다. 그러나 _binding 속성은 LetterListFragment 외부에서 액세스할 필요가 없습니다.

 

 

가장 기억해야하는것.

프래그먼트를 사용하면 onCreateView()에서 레이아웃이 확장된다는 점을 기억하세요. 뷰를 확장하고 _binding 값을 설정하고 루트 뷰를 반환하여 onCreateView()를 구현합니다.

 

엑티비티와 달리 프래그먼트는 컨텍스트가 아니다 => 컨텍스트를 확장하지 않는다.

this(프래그먼트 객체 참조)를 context가 필요한 레이아웃 관리자의 인자로 전달할수 없습니다.

그러나 프래그먼트는 대신 사용할수 있는 컨텍스트 속성을 제공합니다.

requireContext()는 이 프래그먼트에 현재 연결된 컨텍스트(host 액티비티 참조)를 반환합니다.

 

 

 

https://developer.android.com/codelabs/basic-android-kotlin-training-fragments-navigation-component?continue=https%3A%2F%2Fdeveloper.android.com%2Fcourses%2Fpathways%2Fandroid-basics-kotlin-unit-3-pathway-2%23codelab-https%3A%2F%2Fdeveloper.android.com%2Fcodelabs%2Fbasic-android-kotlin-training-fragments-navigation-component#0 

 

프래그먼트 및 탐색 구성요소  |  Android 개발자  |  Android Developers

이 Codelab에서는 프래그먼트를 사용하고 단일 활동 내에서 탐색을 구현하도록 Words 앱을 변환하면서 프래그먼트, 프래그먼트 수명 주기, Jetpack의 탐색 구성요소를 알아봅니다.

developer.android.com