Fragment

낄낄몬스터·2024년 7월 15일
0

앱 개발 숙련

목록 보기
4/9

Fragment

액티비티 위에서 동작하는 모듈화된 사용자 인터페이스

액티비티와 분리되어 독립적으로 동작 불가. 여러 개의 프래그먼트를 하나의 액티비티에 조합하여 창이 여러 개인 UI를 구축할 수 있으며, 하나의 프래그먼트를 여러 액티비티에서 재사용 가능

e.g)

액티비티 vs 프래그먼트 비교

Activity

시스템의 액티비티 매니저에서 인텐드를 해석해 액티비티간 데이터를 전달

Fragment

프래그먼트 생명주기

프래그먼트(Fragment)는 안드로이드 애플리케이션의 UI 부분을 모듈화하여 재사용할 수 있도록 해주는 구성 요소. 프래그먼트는 자체적인 생명주기(lifecycle)를 가지며, 액티비티의 생명주기와 밀접하게 연결돼있음. 프래그먼트의 생명주기를 이해하는 것은 안드로이드 앱을 효율적으로 관리하고, 사용자에게 부드러운 인터페이스 경험을 제공하는 데 중요

프래그먼트의 주요 생명주기 메서드

onAttach()

프래그먼트가 액티비티에 연결될 때 호출됨. 이 시점에서 프래그먼트는 액티비티와 아직 완전히 연결되지는 않음

onCreate()

프래그먼트가 생성될 때 호출됨. 초기화 작업, 리소스 바인딩 등을 수행 가능

onCreateView()

프래그먼트의 레이아웃을 인플레이트 하는 곳. 뷰를 생성하고, 레이아웃을 설정함

onActivityCreated()

액티비티의 onCreate() 메서드가 완료된 후 호출됨. 액티비티와 프래그먼트의 뷰가 모두 생성된 상태이므로, 뷰와 관련된 초기화를 수행

onStart()

프래그먼트가 사용자에게 보여질 준비가 되었을 때 호출됨. 필요한 리소스를 할당하거나, 애니메이션을 시작 가능

onResume()

프래그먼트가 사용자와 상호작용할 수 있는 상태가 되었을 때 호출됨. 프래그먼트가 포그라운드에 있을 때 실행되는 작업을 여기서 처리

onPause()

프래그먼트가 일시정지될 때 호출됨. 상태 저장, 스레드 중지 등의 작업을 수행

onStop()

프래그먼트가 더 이상 사용자에게 보이지 않을 때 호출됨. 리소스 해제, 스레드 정지 등을 수행

onDestroyView()

프래그먼트의 뷰와 관련된 리소스를 정리할 때 호출됨

onDestroy()

프래그먼트가 파괴될 때 호출됨. 프래그먼트의 상태를 정리하고, 모든 리소스를 해제

onDetach()

프래그먼트가 액티비티로부터 분리될 때 호출됨. 프래그먼트가 액티비티와의 모든 연결을 해제

각 단계에서는 프래그먼트의 생명주기에 맞춰 적절한 작업을 수행해야 함.

이를 통해 메모리 누수를 방지하고, 애플리케이션의 성능을 최적화 가능

프래그먼트 사용 이유

프래그먼트 정의하기

액티비티를 만들 때와 비슷하게, 하나의 Kotlin 소스 파일과 하나의 XML 레이아웃로 정의

Kotlin 소스 파일 생성

프래그먼트를 생성하려면 Fragment의 서브클래스(또는 이의 기존 서브클래스)를 생성

프래그먼트에 대해 레이아웃을 제공하려면 반드시 onCreateView()콜백 메서드를 구현

e.g)

class FirstFragment : Fragment() {  
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_first, container, false)
    }

inflate()함수를 통해서 fragment_first.xml 파일로부터 레이아웃을 로드

XML 레이아웃 생성

프래그먼트도 부분 화면이므로 화면에 표시될 뷰들을 정의하는 XML 파일을 /res/layout 폴더 안에 생성

프래그먼트를 액티비티의 레이아웃 파일에 정적 추가하기

프래그먼트를 액티비티의 레이아웃 파일 안에서 선언

< fragment > 안의 android:name 특성은 레이아웃 안에서 인스턴스화할 Fragment 클래스를 지정

[중요] 각 프래그먼트에는 액티비티가 재시작되는 경우 프래그먼트를 복구하기 위해 시스템이 사용할 수 있는 고유한 식별자가 필요. 프래그먼트에 ID를 제공하는 데에는 다음과 같은 세 가지 방법이 있음

고유한 ID와 함께 android:id 속성을 제공

고유한 문자열과 함께 android:tag 속성을 제공

위의 두 가지 중 어느 것도 제공하지 않으면, 시스템은 컨테이너 뷰의 ID를 사용

e.g)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
    <fragment
        android:name="com.skmns.fragmentbasic.FirstFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/fragment" />
</LinearLayout>

Kotlin 코드에서 동적으로 프래그먼트 추가하기

supportFragmentManager.commit {
            replace(R.id.frameLayout, frag)
            setReorderingAllowed(true)
            addToBackStack("")
        }

supportFragmentManager

사용자 상호작용에 응답해 Fragment를 추가하거나 삭제하는등 작업을 할 수 있게 해주는 매니저

replace

어느 프레임 레이아웃에 띄울것이냐, 어떤 프래그먼트냐

setReorderingAllowed

애니메이션과 전환이 올바르게 작동하도록 트랜잭션과 관련된 프래그먼트의 상태 변경을 최적화

addToBackStack

뒤로가기 버튼 클릭 시 다음 액션 (이전 fragment로 가거나 앱이 종료되거나)

profile
음악을 사랑하는 예비 앱개발자

0개의 댓글